Java 我们可以改进这个代码吗?

Java 我们可以改进这个代码吗?,java,java-8,java-stream,optional,Java,Java 8,Java Stream,Optional,我需要根据需要按顺序执行的3个检查选择第一个结果。i、 e如果没有满足条件1的对象,那么我们寻找满足条件2的任何对象,依此类推。这是我的工作代码 MyClass result = myObjects.stream() .filter(s -> s.meetsCriterion1()) .findFirst() .orElseGet(() -> { return myObjects.stream()

我需要根据需要按顺序执行的3个检查选择第一个结果。i、 e如果没有满足条件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;
                        });
                });
        });

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

我将从逻辑中分离标准列表:

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.
List条件=Arrays.asList(
MyCass::meetsCriterion1,
MyCass::meetsCriterion2,
MyCass::MeetScriterion 3
);
MyClass结果=criteria.stream()
.flatMap(c->myObjects.stream().filter(c).limit(1))
.findFirst()
.orElse(空);//有问题。考虑重新设计以避免NULL。

我会将标准列表与逻辑分开:

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.
List条件=Arrays.asList(
MyCass::meetsCriterion1,
MyCass::meetsCriterion2,
MyCass::MeetScriterion 3
);
MyClass结果=criteria.stream()
.flatMap(c->myObjects.stream().filter(c).limit(1))
.findFirst()
.orElse(空);//有问题。考虑重新设计以避免NULL。

欢迎使用堆栈溢出!请考虑张贴。(另外,“optional”标记指编程中optionals的概念)@PWhite findFirst()返回一个
optional
,并且
orElseGet
是可选类的一个方法;因此,OP包含标记“optional”是正确的。请注意,您不需要编写
()->{return expression;}
,一个简单的
()->expression
就足够了;这也适用于嵌套lambda…欢迎使用堆栈溢出!请考虑张贴。(另外,“optional”标记指编程中optionals的概念)@PWhite findFirst()返回一个
optional
,并且
orElseGet
是可选类的一个方法;因此,OP包含标记“optional”是正确的。请注意,您不需要编写
()->{return expression;}
,一个简单的
()->expression
就足够了;这也适用于嵌套lambda…做得很好+1表示“考虑重新设计以避免空值”。做得很好+1表示“考虑重新设计以避免空。”