我需要根据需要按顺序执行的3次检查来选择第一个结果。即如果没有符合标准1的对象,那么我们寻找满足标准2的任何对象,依此类推。这是我的工作代码
MyClass result = myObjects.stream()
.filter(s -> s.meetsCriterion1())
.findFirst()
.orElseGet(() -> {
return myObjects.stream()
.filter(s -> s.meetsCriterion2())
.findFirst()
.orElseGet(() -> {
return myObjects.stream()
.filter(s -> s.meetsCriterion3())
.findFirst()
.orElseGet(() -> {
return null;
});
});
});
我们可以改进这段代码吗?我不确定是否有办法重用第一个流来评估所有标准。
答案 0 :(得分:6)
我会将标准列表与逻辑分开:
List<Predicate<MyClass>> criteria = Arrays.asList(
MyCass::meetsCriterion1,
MyCass::meetsCriterion2,
MyCass::meetsCriterion3
);
MyClass result = criteria.stream()
.flatMap(c -> myObjects.stream().filter(c).limit(1))
.findFirst()
.orElse(null); // questionable. consider redesigning to avoid null.