MyObject我想根据字段过滤列表values。在这种情况下:如果 on 的任何值MyObject::getValues小于给定value,则谓词为 false。我还没有找到使用 Stream API 的方法,所以我尝试ComparatorPredicate了Apache. 这是我的尝试:
private Predicate<MyObject> valueGreaterThanOrEqualTo(ValueObject value){
return myObject -> myObject.getValues().stream()
.noneMatch(v -> ComparatorPredicate.comparatorPredicate(value, new ValueComparator(), ComparatorPredicate.Criterion.LESS)
.evaluate(v));
}
Run Code Online (Sandbox Code Playgroud)
然而,这会导致:
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)
Run Code Online (Sandbox Code Playgroud)
所以我的问题是为什么会发生 ClassCastException 以及如何解决它和/或如何使用其他(更好的?)解决方案解决我的问题?
更新: …
java predicate comparator apache-commons-collection java-stream
我的问题有点复杂(我认为),所以我会尝试使用一个例子。希望你能理解我的问题。
设置说我有一个用户列表:
List<User> users;
Run Code Online (Sandbox Code Playgroud)
在哪里:
public class User{
private List<Car> cars;
}
public class Car{
private String code;
private List<Feature> features;
}
public class Feature{
private String code;
}
Run Code Online (Sandbox Code Playgroud)
我想要实现的是从用户列表中获取汽车列表但是我也希望这个列表是不同的(没有具有相同代码的汽车)但是我希望单个 Car 对象具有来自不同汽车的所有功能相同的代码,这就是我失败的地方。
现在我有
List<Car> cars = users
.stream()
.flatMap(user -> user.getCars())
.???
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用 Predicate 通过代码过滤汽车,但我很难为我要离开的汽车添加功能。有没有一种干净的方法来处理流?