首页 文章

我们能改进这段代码吗?

提问于
浏览
1

我需要根据需要按顺序执行的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 回答

  • 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.
    

相关问题