如何通过使用google collection提供List <x>从Map <x,y>获取List <y>?</x> </x,y> </y>

时间:2011-02-17 18:49:39

标签: java guava

我有Map<X, Y>List<X>,我想通过提供Map<X, Y>List<X>中提取值,这将导致List<Y>。一种方法是

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));  
}

现在我需要使用Predicate或其他东西删除值(List<Y>)中的空值。有没有更好的方法呢?
谷歌馆藏库中没有这种方法有什么好的理由吗?

3 个答案:

答案 0 :(得分:4)

这样的事情:

List<Y> values = Lists.newArrayList(
    Iterables.filter(
        Lists.transform(getKeys(), Functions.forMap(getMap(), null), 
        Predicates.notNull()));

答案 1 :(得分:0)

鉴于您的具体要求,

@axtavt's answer可能是最有效的。如果您的List密钥是Set,那么这样的话就是我的偏好:

List<Y> values = Lists.newArrayList(
    Maps.filterKeys(getMap(), Predicates.in(getKeys())).values());

我认为这样做的一种特殊方法不是在番石榴中,因为它通常不够用。另外,正如您所看到的,有很多方法可以组合Guava为实现这一目标而提供的功能。 Guava专注于提供构建模块,具有非常常见的特定操作方法。

答案 2 :(得分:0)

axtavt's answer相同的概念,但使用FluentIterable(按顺序读取而不是从里到外读取):

List<Y> values = FluentIterable
    .from(keys)
    .transform(Functions.forMap(map, null))
    .filter(Predicates.notNull())
    .toList();