Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.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 谓词检查来自同一类的不同对象的属性的相等性_Java_Java Stream - Fatal编程技术网

Java 谓词检查来自同一类的不同对象的属性的相等性

Java 谓词检查来自同一类的不同对象的属性的相等性,java,java-stream,Java,Java Stream,使用Java8流式API,我希望通过检查相同类型的示例对象的某些属性之间的相等性来过滤对象集合,如 myFooCollection.stream().filter(foo -> foo.getBar().getBaz().equals(fooSampleObject.getBar().getBaz())); 由于我想应用几个相同结构但具有不同属性路径的过滤器,有没有一种方法可以方便地实现这一点?(例如,对于以属性路径为参数的自定义谓词?如果等式条件满足您的需要,则可以使用equals方法

使用Java8流式API,我希望通过检查相同类型的示例对象的某些属性之间的相等性来过滤对象集合,如

myFooCollection.stream().filter(foo -> foo.getBar().getBaz().equals(fooSampleObject.getBar().getBaz()));

由于我想应用几个相同结构但具有不同属性路径的过滤器,有没有一种方法可以方便地实现这一点?(例如,对于以属性路径为参数的自定义谓词?

如果等式条件满足您的需要,则可以使用
equals
方法。如果需要不同的条件,自定义谓词将起作用。最简单的方法可能是一个自定义谓词,它将
fooSampleObject
作为构造函数参数,并在
test
方法中执行所有必要的检查。

您可以创建一个谓词,通过将它和
函数
传递给方法来测试与
fooSampleObject
的相等性以下方式:

private static <T,R> Predicate<T> getEqualsPredicate(T foo, Function<T, R> trFunction) {
    R apply = trFunction.apply(foo);
    Predicate<R> p = Predicate.isEqual(apply);
    return z -> p.test(trFunction.apply(z));
}
List<Foo> result = myFooCollection.stream()
        .filter(getEqualsPredicate(fooSampleObject, (Foo f) -> f.getBar().getBaz()))
        .collect(Collectors.toList());
私有静态谓词getEqualsPredicate(T foo,函数trFunction){
R应用=trFunction.apply(foo);
谓词p=谓词.isEqual(应用);
返回z->p.test(trFunction.apply(z));
}
然后,您可以使用以下方法:

private static <T,R> Predicate<T> getEqualsPredicate(T foo, Function<T, R> trFunction) {
    R apply = trFunction.apply(foo);
    Predicate<R> p = Predicate.isEqual(apply);
    return z -> p.test(trFunction.apply(z));
}
List<Foo> result = myFooCollection.stream()
        .filter(getEqualsPredicate(fooSampleObject, (Foo f) -> f.getBar().getBaz()))
        .collect(Collectors.toList());
List result=myFooCollection.stream()
.filter(getEqualsPredicate(fooSampleObject,(Foo f)->f.getBar().getBaz())
.collect(Collectors.toList());