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

时间:2011-02-15 12:48:18

标签: java list dictionary guava

我有一个字符串列表,我有一个函数为列表中的每个键生成一个值。

我想使用此功能创建地图。我可以使用Google收藏夹吗?

5 个答案:

答案 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>)(以及SortedSetNavigableSet的两次重载)可让您查看SetFunction作为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());