我有一个字符串列表,我有一个函数为列表中的每个键生成一个值。
我想使用此功能创建地图。我可以使用Google收藏夹吗?
答案 0 :(得分:87)
使用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;
}});
答案 1 :(得分:23)
截至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
,其中iterable的不同元素是键,值是将函数应用于每个键的结果。
答案 2 :(得分:15)
如果原始列表是键,那么听起来您可以通过MapMaker.makeComputingMap
使用计算地图,并忽略输入列表以开始。 编辑:正如评论中所述,现在已在Guava 15.0中弃用和删除。请改为查看CacheBuilder
。
另一方面,如果你要求一个与列表中不在的键对应的值,那么它也不会给你一个返回null的映射。它也不会给你换句话说,这可能不是合适的,但它值得考虑,取决于你试图用它做什么。 :)
我会在这里留下这个答案,除非你评论这里没有方法对你有用,在这种情况下我会删除它。
原始回答
使用Guava,您可以使用Maps.uniqueIndex
轻松完成此操作:
Map<String, String> map = Maps.uniqueIndex(list, keyProjection);
(我特别提到了Guava,而不是谷歌收藏,因为我没有检查旧的Google收藏库是否包含Maps.uniqueIndex
。)
答案 3 :(得分:13)
要么我误解了你或其他海报都有。我知道您希望列表成为地图键,而Maps.uniqueIndex()
会创建映射到您的值的键(这恰恰相反)。
无论如何,有一个open Guava issue请求您要求的确切功能,我还有implemented such a solution用于上一个问题。
答案 4 :(得分:6)
使用Guava + Lamba
Map<String, YourCustomClass> map = Maps.uniqueIndex(YourList, YourCustomClass -> YourCustomClass.getKey());