values
필드를 기준으로 MyObject
의 목록을 필터링하고 싶습니다. 이 경우 : MyObject::getValues
의 값이 주어진 value
보다 작 으면 술어가 false입니다. 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
는 잘 동작하므로, 만약 당신이 그것을 좋아한다면 : 그것을 위해 가십시오. 그러나 나는 외부 libs를 사용하는 것을 포함하지 않고 더 간단하고 수용된 대답으로부터의 제안을 할 것이다. 특히 ComparatorPredicate
부터 java.util.function.Predicate
까지는 확장되지 않고 org.apache.commons.collections4.Predicate
으로 확장됩니다.
'ValueComparator'가'Comparator '을 구현하지 않으면 예상되는 일을 수행하는'compare' 메소드가있는 경우에도 작동합니다. –
Holger