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