【问题标题】:Java 8 Stream filter with comparator带有比较器的 Java 8 流过滤器
【发布时间】:2017-12-12 13:39:27
【问题描述】:

我想根据values 字段过滤MyObject 的列表。在这种情况下:如果MyObject::getValues 上的任何值小于给定的value,则谓词为假。我还没有找到使用 Stream API 的方法,所以我通过Apache 尝试了ComparatorPredicate。这是我的尝试:

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

【问题讨论】:

    标签: java java-stream comparator predicate apache-commons-collection


    【解决方案1】:

    我不明白你为什么必须使用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&lt;ValueObject&gt;

    【讨论】:

    猜你喜欢
    • 2016-12-30
    • 2015-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多