我有一个字符串列表并且有一个函数可以为列表中的每个键生成一个值。我想使用这个函数创建一个映射表。我能用Google Collections实现吗?
使用 Maps.uniqueIndex(Iterable, Function):
返回一个不可变的 Map,其中 Map.values() 是给定元素按照给定顺序排列的结果,并且每个 key 都是对应 value 应用提供的函数后得到的乘积。(来自 javadoc)
示例:
Map<String,String> mappedRoles = Maps.uniqueIndex(yourList, new Function<String,String>() {
public String apply(String from) {
// do stuff here
return result;
}});
Set
和Function
视为一个Map
,其中集合中每个键的值是将该键应用于函数的结果。结果是一个视图,因此它不会复制输入集合,并且Map
结果将随着集合的更改而更改,反之亦然。Iterable
并急切地将其转换为一个ImmutableMap
,其中可迭代的不同元素是键,而每个键上应用函数的结果则是对应的值。编辑:Sean可能是对的,我可能误解了问题。
如果原始列表是指keys,那么似乎你可以通过MapMaker.makeComputingMap
使用计算映射,并忽略输入列表。 编辑:如评论中所述,这在Guava 15.0中已被弃用和删除。 另请查看CacheBuilder
。
另一方面,这也不会给你一个地图,如果你问它一个起始列表中没有的键对应的值,它将返回null。换句话说,这可能是不合适的,但根据你想要做什么,这也值得考虑。 :)
除非您评论说都不有用,否则我会把这个答案留在这里,否则我会删除它。
原始回答
使用Guava,您可以使用Maps.uniqueIndex
轻松完成此操作:
Map<String, String> map = Maps.uniqueIndex(list, keyProjection);
我特别提到了Guava而不是Google collections,因为我没有检查旧的Google collections存储库是否包括Maps.uniqueIndex
。
makeComputingMap
已被弃用,并计划很快删除。http://code.google.com/p/guava-libraries/wiki/MapMakerMigration - ripper234我可能误解了你的意思,或者其他帖子的作者们误解了。我的理解是您希望将列表作为地图键,而 Maps.uniqueIndex()
则创建了可映射到您的值的键(正好相反)。
无论如何,有一个Guava问题请求要求您所要求的确切功能,我还为先前的问题实现了这样一种解决方案。
Using Guava + Lambda
Map<String, YourCustomClass> map = Maps.uniqueIndex(YourList, YourCustomClass -> YourCustomClass.getKey());
Multimaps.index
生成一个Multimap
,它可以为相同的键存储多个值。 - ColinD