values
フィールドに基づいてMyObject
のリストをフィルタしたいと思います。この場合:MyObject::getValues
のいずれかの値が与えられた値よりも小さい場合は、述語がfalseであるよりもvalue
です。私はStream APIでそれを行う方法を見つけていないので、ComparatorPredicate
でApache
を試しました。コンパイラを使用した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
はうまく動作します。しかし、私は、より簡単で、外部ライブラリを使用することを伴わない、受け入れられた答えからの提案に行くでしょう。特にComparatorPredicate
はjava.util.function.Predicate
ではなく、org.apache.commons.collections4.Predicate
となります。
'ValueComparator'が' Comparator 'を実装していない場合でも、それは予想されることを行う' compare'メソッドを持っている限り動作します。 –
Holger