如何使用Google集合将List <String>转换为Map <String,String>?

我有一个string的列表,我有一个函数来为列表中的每个键生成值,我想用一个方法创build地图。 谷歌collections有这样的function吗?

截至2012年7月26日,番石榴大师包含两个新的方法来做到这一点。 他们应该在14.0版本。

Maps.asMap(Set<K>, Function<? super K, V>) (以及SortedSetNavigableSet两个重载)允许您查看Set plus Function作为Map ,其中set中的每个键的值为将该函数应用于该键的结果。 结果是一个视图,所以它不会复制input集合,而且Map结果将随着集合的变化而变化,反之亦然。

Maps.toMap(Iterable<K>, Function<? super K, V>)接受一个Iterable并且迫切地将它转换为一个ImmutableMap ,其中迭代的不同元素是键,值是将函数应用到每个键。

使用Maps.uniqueIndex(Iterable,Function) :

返回Map.values()是给定顺序的给定元素的不可变映射,每个键都是调用所提供函数的对应值的乘积。 (来自javadoc)

例:

 Map<String,String> mappedRoles = Maps.uniqueIndex(yourList, new Function<String,String>() { public String apply(String from) { // do stuff here return result; }}); 

编辑:肖恩的权利,我误解了这个问题是完全可能的。

如果原始列表是关键字 ,那么听起来好像您可能只能通过MapMaker.makeComputingMap使用计算地图,并忽略开始的input列表。 编辑:正如在评论中指出的,这是现在已经过时,并在番石榴15.0删除。 看看CacheBuilder

另一方面,如果你要求一个对应于不在列表中的键的值,那么也不会给你一个返回null的映射。 它也不会给你换句话说,这可能是恰当的,但值得考虑,取决于你想要做什么。 🙂

我将在这里留下这个答案,除非你评论这两种方法对你都没有用,在这种情况下,我将删除它。


原始答案

使用番石榴,你可以很容易地用Maps.uniqueIndex做到这Maps.uniqueIndex

 Map<String, String> map = Maps.uniqueIndex(list, keyProjection); 

(我提到Guava是专门针对Googlecollections的,因为我没有检查旧的Googlecollections库是否包含Maps.uniqueIndex 。)

要么我误解了你或者其他海报。 我知道你希望你的列表是地图键,而Maps.uniqueIndex()创build键映射到你的值(这是相反的)。

无论如何,有一个开放的番石榴问题 ,要求你正在请求的确切function,我也已经实现了这样一个解决scheme的前一个问题。

使用Guava + Lamba

  Map<String, YourCustomClass> map = Maps.uniqueIndex(YourList, YourCustomClass -> YourCustomClass.getKey());