2

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

답변

4

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>을 구현합니다.

+0

'ValueComparator'가'Comparator '을 구현하지 않으면 예상되는 일을 수행하는'compare' 메소드가있는 경우에도 작동합니다. – Holger