【发布时间】:2011-06-27 14:12:31
【问题描述】:
我有一个字符串列表,我有一个函数可以为列表中的每个键生成一个值。
我想用这个函数创建一个地图。我可以使用 Google 收藏集吗?
【问题讨论】:
-
我假设您知道这一点,但如果函数生成的值对于原始列表中的任何两个元素可能相同,则您需要使用
Multimaps.index生成一个Multimap可以为同一个键存储多个值。
标签: java list dictionary guava
我有一个字符串列表,我有一个函数可以为列表中的每个键生成一个值。
我想用这个函数创建一个地图。我可以使用 Google 收藏集吗?
【问题讨论】:
Multimaps.index 生成一个 Multimap可以为同一个键存储多个值。
标签: java list dictionary guava
使用Maps.uniqueIndex(Iterable, Function):
返回一个不可变的映射, Map.values() 是给定的元素 给定的顺序,每个键是 调用提供的产品 函数对应的值。(from javadoc)
例子:
Map<String,String> mappedRoles = Maps.uniqueIndex(yourList, new Function<String,String>() {
public String apply(String from) {
// do stuff here
return result;
}});
【讨论】:
截至 2012 年 7 月 26 日,Guava master 包含两种新方法来执行此操作。它们应该在 14.0 版中。
Maps.asMap(Set<K>, Function<? super K, V>)(以及SortedSet 和NavigableSet 的两个重载)允许您将Set 加上Function 作为Map 查看,其中集合中每个键的值是将该功能应用于该键。结果是一个视图,因此它不会复制输入集,Map 结果会随着集的变化而变化,反之亦然。
Maps.toMap(Iterable<K>, Function<? super K, V>) 接受 Iterable 并急切地将其转换为 ImmutableMap,其中可迭代的不同元素是键,值是将函数应用于每个键的结果。
【讨论】:
编辑:肖恩完全有可能是对的,我误解了这个问题。
如果原始列表是 keys,那么听起来您可以通过 MapMaker.makeComputingMap 使用计算映射,而忽略输入列表开始。 编辑:如 cmets 中所述,现在已在 Guava 15.0 中弃用和删除。请查看 CacheBuilder。
另一方面,如果您要求它提供与不在列表中的键相对应的值,这也不会为您提供返回 null 的映射。它也不会给你 换句话说,这可能不是合适的,但值得考虑,这取决于你想用它做什么。 :)
我将把这个答案留在这里,除非你评论说这里的两种方法都没有对你有用,在这种情况下我会删除它。
原答案
使用Guava,您可以通过Maps.uniqueIndex轻松做到这一点:
Map<String, String> map = Maps.uniqueIndex(list, keyProjection);
(我特别提到了 Guava,而不是 Google 集合,因为我没有检查旧的 Google 集合存储库是否包含 Maps.uniqueIndex。)
【讨论】:
makeComputingMap 已弃用,并计划很快删除。 code.google.com/p/guava-libraries/wiki/MapMakerMigration
要么我误解了你,要么其他海报有。我了解您希望您的列表成为映射键,而 Maps.uniqueIndex() 创建键以映射到您的值(恰恰相反)。
无论如何,有一个open Guava issue 请求您请求的确切功能,我还有一个implemented such a solution 用于上一个问题。
【讨论】:
使用 Guava + Lambda
Map<String, YourCustomClass> map = Maps.uniqueIndex(YourList, YourCustomClass -> YourCustomClass.getKey());
【讨论】: