Java 8流和比较器的筛选器

4

我希望能够基于values字段过滤MyObject列表。在这种情况下,如果MyObject::getValues中的任何一个值小于给定的value,那么谓词就是false。我没有找到使用Stream API实现它的方法,所以我尝试了ApacheComparatorPredicate。以下是我的尝试:

private Predicate<MyObject> valueGreaterThanOrEqualTo(ValueObject value){
    return myObject -> myObject.getValues().stream()
            .noneMatch(v -> ComparatorPredicate.comparatorPredicate(value, new ValueComparator(), ComparatorPredicate.Criterion.LESS)
                    .evaluate(v));
}

然而,这会导致:
Caused by: java.lang.ClassCastException: Cannot cast java.lang.Boolean to com.ValueObject
    at java.lang.Class.cast(Class.java:3369)
    at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
    at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
    at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
    at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)
    at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
    at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
    at java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1351)
    at java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:126)
    at java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:498)
    at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:485)
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
    at java.util.stream.MatchOps$MatchOp.evaluateSequential(MatchOps.java:230)
    at java.util.stream.MatchOps$MatchOp.evaluateSequential(MatchOps.java:196)
    at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.util.stream.ReferencePipeline.noneMatch(ReferencePipeline.java:459)

所以我的问题是ClassCastException为什么会发生,如何解决它和/或者如何通过其他更好的解决方案来解决我的问题?
更新:关于这个问题的最新情况。第一个问题(ClassCastException)是由我没有包含在我的示例中的代码引起的。解决了这个问题之后,ComparatorPredicate运行良好。如果你喜欢它,就使用它吧。然而,我将采用答案建议中更简单的方法,这种方法不涉及使用外部库。尤其是因为ComparatorPredicate不扩展java.util.function.Predicate,而是扩展org.apache.commons.collections4.Predicate。
1个回答

5

我不明白为什么你要使用ComparatorPredicate.comparatorPredicate

可以这样写:

private Predicate<MyObject> valueGreaterThanOrEqualTo(ValueObject value){
    ValueComparator comparator = new ValueComparator();
    return myObject -> myObject.getValues().stream()
            .noneMatch(v -> comparator.compare(v,value)<0);
}

假设ValueComparator实现了 Comparator<ValueObject>

1
只要ValueComparator有一个执行预期操作的compare方法,即使它没有实现Comparator<ValueObject>,它也可以正常工作。 - Holger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接