我们可以改进这段代码吗?

时间:2016-06-22 17:22:22

标签: java java-8 java-stream optional

我需要根据需要按顺序执行的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;
                        });
                });
        });

我们可以改进这段代码吗?我不确定是否有办法重用第一个流来评估所有标准。

1 个答案:

答案 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.