Java 8 带比较器的流过滤器
Java 8 Stream filter with comparator
我想根据 values
字段过滤 MyObject
的列表。在这种情况下:如果 MyObject::getValues
上的任何值小于给定的 value
,则谓词为假。我还没有找到使用 Stream API 的方法,所以我尝试 ComparatorPredicate
by Apache
。这是我的尝试:
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.accept(ReferencePipeline.java:193)
at java.util.stream.ReferencePipeline.accept(ReferencePipeline.java:193)
at java.util.stream.ReferencePipeline.accept(ReferencePipeline.java:193)
at java.util.stream.ReferencePipeline.accept(ReferencePipeline.java:175)
at java.util.stream.ReferencePipeline.accept(ReferencePipeline.java:193)
at java.util.stream.ReferencePipeline.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如何使用其他(更好的?)解决方案解决我的问题?
更新:
关于这个问题的一点更新。第一个问题 (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>
。
我想根据 values
字段过滤 MyObject
的列表。在这种情况下:如果 MyObject::getValues
上的任何值小于给定的 value
,则谓词为假。我还没有找到使用 Stream API 的方法,所以我尝试 ComparatorPredicate
by Apache
。这是我的尝试:
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.accept(ReferencePipeline.java:193)
at java.util.stream.ReferencePipeline.accept(ReferencePipeline.java:193)
at java.util.stream.ReferencePipeline.accept(ReferencePipeline.java:193)
at java.util.stream.ReferencePipeline.accept(ReferencePipeline.java:175)
at java.util.stream.ReferencePipeline.accept(ReferencePipeline.java:193)
at java.util.stream.ReferencePipeline.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如何使用其他(更好的?)解决方案解决我的问题?
更新:
关于这个问题的一点更新。第一个问题 (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>
。