我需要从给定特定条件的集合中提取许多唯一元素。例如。如果我有一个带有 [ (a1,t1,v1), (a2,t2,v2),...,(an,tx,vy) ] 的集合 我想要 a1、t5、v8。
使用 Guava,我可以为每个元素创建一个谓词(例如 IsA1 实现谓词...),然后使用 Iterables.find(collection, predicate) 来定位每个元素。没关系,但它可能会循环遍历每个谓词的整个集合。
我可以使用 Predicates.or(...) 将谓词合并为一个,并使用 Iterables.filter,但随后我必须在结果迭代中搜索我需要的每个特定元素。
我想要一个函数 - 让我们称之为“定位” - 它将获取元素集合、谓词列表并生成(谓词 -> 元素)的映射
<T> Map<Predicate<? super T>, T> locate(Collection<T>, Collection<Predicate<? super T>)
我自己推出了,因为我找不到它,但这是一个常见的情况,我想我只是还没有找到它。
我的版本供引用:
public static <T> Map<Predicate<? super T>,T> locateUnique(Iterable<T> col, Collection<Predicate<? super T>> predicates) {
HashMap<Predicate<? super T>, T> result = Maps.newHashMap();
for (T t:col) {
for (Predicate<? super T> p:predicates) {
if (p.apply(t)){
result.put(p, t);
}
}
}
return result;
}
有没有一种现成的方法可以做到这一点?我想为了完整性应该有两个版本:
locateUnique(...) -> Map<Predicate,T>
locate(...) -> MultiMap<Predicat,T>
最佳答案
这里是 Guava 团队成员。执行此操作的首选方法正是您所描述的方式 - 滚动您自己的方法 - 尽管依赖于 Predicate
的 equals
方法有点冒险。
不过,鉴于我们已经pretty stingy,我非常有信心这种情况远没有您描述的那么常见。关于功能性习语。
关于java - 谷歌 Guava : Supported way to get elements of a collection that comply with a given predicate?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9567921/