Java 如何获取列表<;Y>;从地图<;十、 Y>;通过提供列表<;X>;使用谷歌收藏?

Java 如何获取列表<;Y>;从地图<;十、 Y>;通过提供列表<;X>;使用谷歌收藏?,java,guava,Java,Guava,我有一个映射和列表,我想通过提供列表,从映射中提取值,这将导致列表。一种方法是 List<X> keys = getKeys(); Map<X, Y> map = getMap(); List<Y> values = Lists.newArrayListWithCapacity(keys.size()); for(X x : keys){ values.add(map.get(x)); } List keys=getKeys();

我有一个
映射
列表
,我想通过提供
列表
,从
映射
中提取值,这将导致
列表
。一种方法是

List<X> keys = getKeys();  
Map<X, Y> map = getMap();  
List<Y> values = Lists.newArrayListWithCapacity(keys.size());  
for(X x : keys){  
   values.add(map.get(x));  
}
List keys=getKeys();
Map Map=getMap();
列表值=Lists.newArrayListWithCapacity(keys.size());
对于(X:keys){
value.add(map.get(x));
}
现在我需要再次使用谓词或其他方法删除值(
List
)中的空值。有更好的方法吗?
google collections library中没有此方法有什么好的理由吗?

类似这样的内容:

List<Y> values = Lists.newArrayList(
    Iterables.filter(
        Lists.transform(getKeys(), Functions.forMap(getMap(), null), 
        Predicates.notNull()));
List values=Lists.newArrayList(
Iterables.filter(
Lists.transform(getKeys(),Functions.forMap(getMap(),null),
谓词。notNull());
考虑到您的确切要求,
可能是最有效的。如果您的
钥匙列表
是一套
钥匙,我会选择这样的:

List<Y> values = Lists.newArrayList(
    Maps.filterKeys(getMap(), Predicates.in(getKeys())).values());
List values=Lists.newArrayList(
Maps.filterKeys(getMap(),谓词.in(getKeys()).values());
我认为在Guava中没有一种特殊的方法来实现这一点,因为它通常不够有用。此外,正如您所看到的,Guava提供了一些方法来实现这一点。Guava专注于提供构建块,并为非常常见的操作提供特定的方法。

与相同的概念,但使用的是
Fluentiable
(按顺序读取,而不是由内而外):

列表值=可流动
.从(钥匙)
.transform(Functions.forMap(map,null))
.filter(谓词.notNull())
.toList();

同意..但哪种方式更有效1)我在问题2中提到的答案由@axtavt@Premraj:我认为@axtavt的解决方案更有效,因为它只需在密钥列表中迭代一次。问题中的解决方案需要遍历键列表,然后再次遍历值列表以删除null。这可以通过迭代时使用
Iterables.filter(keys,notNull())
来解决,但@axtavt的解决方案基本上就是这么做的。虽然我更喜欢函数式方法,但如果Premraj想使用他的迭代解决方案,他可以在for循环中执行null检查:for(X:keys){Y=map.get(X);if(y!=null){values.add(y);}这将避免遍历列表两次。这两种方法在性能方面的唯一区别是,axtavt解决方案可能需要多次调整其ArrayList的大小,而Premraj则在构建时设置容量。这是一种折衷,因为他可能最终初始化一个大数组以容纳几个条目…@eneveu:你是对的嗯,他可以在循环中做一个简单的空检查。@axtavt的解决方案可以通过先用预期的大小初始化
ArrayList
,然后使用
Iterables.addAll
来避免调整大小。即使你在上面的代码中添加空检查,它也比下面的答案可读得多。但是,这只是我的操作伊尼翁;)
List<Y> values = FluentIterable
    .from(keys)
    .transform(Functions.forMap(map, null))
    .filter(Predicates.notNull())
    .toList();