我想知道如果过滤器没有找到值并找到它,如何从流中执行代码,示例代码:
@Transactional
public void change(ClassName dep){
// code
dep.getFoo()
.stream()
.filter(f -> f.getName().equals(doo.getName))
}
如果过滤器有一个值,则:
user.setFoo(f);
如果过滤器中没有值,则:
Foo foo = new Foo();
foo.setName("Exp");
user.setFoo(foo);
最佳答案
我建议为 Foo
创建一个接受 name
的构造函数。
然后您可以使用默认值可选
提取名称:
Foo foo = dep.getFoo()
.stream()
.filter(f -> f.getName().equals(doo.getName))
.findAny().orElse(new Foo("Exp"));
user.setFoo(foo);
Holger 巧妙地注意到,如果 Optional
不为空,则使用 orElseGet
可以避免执行 Supplier
(如果计算复杂或发生副作用):
Foo foo = dep.getFoo()
.stream()
.filter(f -> f.getName().equals(doo.getName))
.findAny().orElseGet(() -> new Foo("Exp"));
user.setFoo(foo);
从 java 11 开始,您可以使用 ifPresentOrElse
:
dep.getFoo()
.stream()
.filter(f -> f.getName().equals(doo.getName))
.findAny()
.ifPresentOrElse(user::setFoo, () -> user.setFoo(new Foo("Exp")));
P.S.:如果您无法创建构造函数,您可以只创建提供它的方法并在上面的代码片段中使用它:
public static Foo defaultFoo() {
Foo foo = new Foo();
foo.setName("Exp");
return foo;
}
关于java - 如果stream().filter为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71263430/