2

valuesフィールドに基づいてMyObjectのリストをフィルタしたいと思います。この場合:MyObject::getValuesのいずれかの値が与えられた値よりも小さい場合は、述語がfalseであるよりもvalueです。私はStream APIでそれを行う方法を見つけていないので、ComparatorPredicateApacheを試しました。コンパイラを使用したJava 8ストリームフィルタ

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が発生していると、AND/ORどのようにいくつかと私の問題を解決するには、それを解決する方法をここに私の試みです他の(より良い?)ソリューション?

UPDATE:

問題にはほとんど更新。最初の問題(ClassCastException)は、私の例では含まれていなかったコードによって引き起こされました。それを解決した後、ComparatorPredicateはうまく動作します。しかし、私は、より簡単で、外部ライブラリを使用することを伴わない、受け入れられた答えからの提案に行くでしょう。特にComparatorPredicatejava.util.function.Predicateではなく、org.apache.commons.collections4.Predicateとなります。

答えて

4

ComparatorPredicate.comparatorPredicateを使用しなければならない理由はわかりません。これはValueComparator実装Comparator<ValueObject>を想定している

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

:どの程度

+0

'ValueComparator'が' Comparator 'を実装していない場合でも、それは予想されることを行う' compare'メソッドを持っている限り動作します。 – Holger

関連する問題