Java Google Guava:获取符合给定谓词的集合元素的受支持方式?
我需要从给定特定条件的集合中提取一些独特的元素。例如,如果我有一个集合[(a1,t1,v1),(a2,t2,v2),…,(an,tx,vy)] 我想要a1,t5,v8 使用Guava,我可以为每个元素设置一个谓词(例如IsA1实现谓词…),然后使用Iterables.find(collection,Predicate)来定位每个元素。这没关系,但它可能会在每个谓词的整个集合中循环 我可以使用predicates.or(…)将谓词组合成一个谓词,然后使用Iterables.filter,但是我必须为我需要的每个特定元素搜索结果iterable 我想要的是一个函数——我们称之为“locate”——它将获取元素集合、谓词列表并生成(谓词->元素)的映射Java Google Guava:获取符合给定谓词的集合元素的受支持方式?,java,collections,functional-programming,guava,Java,Collections,Functional Programming,Guava,我需要从给定特定条件的集合中提取一些独特的元素。例如,如果我有一个集合[(a1,t1,v1),(a2,t2,v2),…,(an,tx,vy)] 我想要a1,t5,v8 使用Guava,我可以为每个元素设置一个谓词(例如IsA1实现谓词…),然后使用Iterables.find(collection,Predicate)来定位每个元素。这没关系,但它可能会在每个谓词的整个集合中循环 我可以使用predicates.or(…)将谓词组合成一个谓词,然后使用Iterables.filter,但是我必须
Map这里是番石榴团队成员。执行此操作的首选方法正是您描述的方法--滚动您自己的方法--尽管依赖谓词的equals
方法有点风险
不过,考虑到我们已经在研究函数式习惯用法,我很有信心,这种情况远没有您描述的那么普遍。谢谢您的验证。我想关于equals
的警告与可以通过它表达的谓词
互换性属性有关。关于Java中的FP,这是一个弊大于利的问题。在经典Java中,您可以使用一组Comparable
s来表示这种情况,其中我只需要相等的部分(即不完整的实现)。选项1无法维护,选项2过量/不符合要求<代码>谓词
s在LOC和可读性方面似乎是合理的选择。欢迎提出建议:-)
<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>