使用Java 8 Streaming API,我想通过检查相同类型的样本对象的某些属性之间的相等性来过滤对象集合,例如
myFooCollection.stream().filter(foo -> foo.getBar().getBaz().equals(fooSampleObject.getBar().getBaz()));
由于我想应用几个相同结构但具有不同属性路径的过滤器,有没有办法以方便的方式完成此操作? (例如使用自定义谓词,它将属性路径作为参数?)
答案 0 :(得分:1)
您可以通过以下方式将fooSampleObject
传递给方法来创建一个测试与Function
相等的谓词:
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());
答案 1 :(得分:0)
如果您需要的是相等条件,则可以使用equals
方法。如果您需要不同的条件,自定义谓词将起作用。最简单的方法可能是自定义谓词,它将fooSampleObject
作为构造函数参数,并在test
方法中执行所有必要的检查。