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

时间:2016-10-12 18:16:36

标签: java java-stream

使用Java 8 Streaming API,我想通过检查相同类型的样本对象的某些属性之间的相等性来过滤对象集合,例如

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

由于我想应用几个相同结构但具有不同属性路径的过滤器,有没有办法以方便的方式完成此操作? (例如使用自定义谓词,它将属性路径作为参数?)

2 个答案:

答案 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方法中执行所有必要的检查。