我有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>
)中的空值。有没有更好的方法呢?
谷歌馆藏库中没有这种方法有什么好的理由吗?
答案 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();