簡體   English   中英

具有比較器的Java 8流過濾器

[英]Java 8 Stream filter with comparator

我想根據values字段過濾MyObject的列表。 在這種情況下:如果MyObject::getValues上的任何值小於給定value ,則謂詞為false。 我還沒有找到使用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

我不明白為什么您必須使用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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM