Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Google Guava:获取符合给定谓词的集合元素的受支持方式?_Java_Collections_Functional Programming_Guava - Fatal编程技术网

Java Google Guava:获取符合给定谓词的集合元素的受支持方式?

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,但是我必须

我需要从给定特定条件的集合中提取一些独特的元素。例如,如果我有一个集合[(a1,t1,v1),(a2,t2,v2),…,(an,tx,vy)] 我想要a1,t5,v8

使用Guava,我可以为每个元素设置一个谓词(例如IsA1实现谓词…),然后使用Iterables.find(collection,Predicate)来定位每个元素。这没关系,但它可能会在每个谓词的整个集合中循环

我可以使用predicates.or(…)将谓词组合成一个谓词,然后使用Iterables.filter,但是我必须为我需要的每个特定元素搜索结果iterable

我想要的是一个函数——我们称之为“locate”——它将获取元素集合、谓词列表并生成(谓词->元素)的映射


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>