如何使用Google集合将List <String>转换为Map <String,String>?
我有一个string的列表,我有一个函数来为列表中的每个键生成值,我想用一个方法创build地图。 谷歌collections有这样的function吗?
截至2012年7月26日,番石榴大师包含两个新的方法来做到这一点。 他们应该在14.0版本。
Maps.asMap(Set<K>, Function<? super K, V>)
(以及SortedSet
和NavigableSet
两个重载)允许您查看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());