Java 我们可以改进这个代码吗?
我需要根据需要按顺序执行的3个检查选择第一个结果。i、 e如果没有满足条件1的对象,那么我们寻找满足条件2的任何对象,依此类推。这是我的工作代码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()
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表示“考虑重新设计以避免空。”