在不执行 "else" 逻辑的情况下从 Optional 在功能上重写赋值
Functionally rewriting assignment from an Optional without executing "else" logic
我的代码中有以下内容:
Optional<Foo> optionalFoo = fooDAO.findByName(name);
Foo foo;
if(!optionalFoo.isPresent()) {
foo = fooDAO.addFoo(name);
} else {
foo = optionalFoo.get();
}
IntelliJ 弹出一个提示 can be replaced with single expression in functional style
。我尝试将此块替换为:
Optional<Foo> optionalFoo = fooDAO.findByName(name);
Foo foo = optionalFoo.orElse(fooDAO.addFoo(name));
这导致测试失败,因为无论 Optional
是否为空都会调用 fooDAO.addFoo(name)
,并且 addFoo
中的逻辑不应该是 运行如果 Foo
已经存在。
除非必要,是否可以在不调用 fooDAO.addFoo(name)
的情况下从功能上重写原始块?
您正在查找 orElseGet
,它接受仅在值不存在时才调用的 Supplier
:
Foo foo = fooDAO.findByName(name)
.orElseGet(() -> fooDAO.addFoo(name));
我认为 name
需要有效地最终才能使它起作用。
orElse
接受一个值作为参数,所以你传递的函数总是执行。
如有必要,要创建 foo
,您应该使用 orElseGet
:
Foo foo = fooDAO.findByName(name).orElseGet(() -> fooDAO.addFoo(name));
将 Optional.orElseGet 与 lambda 表达式一起使用:
Optional<Foo> optionalFoo = fooDAO.findByName(name);
Foo foo = optionalFoo.orElseGet(()->fooDAO.addFoo(name));
我的代码中有以下内容:
Optional<Foo> optionalFoo = fooDAO.findByName(name);
Foo foo;
if(!optionalFoo.isPresent()) {
foo = fooDAO.addFoo(name);
} else {
foo = optionalFoo.get();
}
IntelliJ 弹出一个提示 can be replaced with single expression in functional style
。我尝试将此块替换为:
Optional<Foo> optionalFoo = fooDAO.findByName(name);
Foo foo = optionalFoo.orElse(fooDAO.addFoo(name));
这导致测试失败,因为无论 Optional
是否为空都会调用 fooDAO.addFoo(name)
,并且 addFoo
中的逻辑不应该是 运行如果 Foo
已经存在。
除非必要,是否可以在不调用 fooDAO.addFoo(name)
的情况下从功能上重写原始块?
您正在查找 orElseGet
,它接受仅在值不存在时才调用的 Supplier
:
Foo foo = fooDAO.findByName(name)
.orElseGet(() -> fooDAO.addFoo(name));
我认为 name
需要有效地最终才能使它起作用。
orElse
接受一个值作为参数,所以你传递的函数总是执行。
如有必要,要创建 foo
,您应该使用 orElseGet
:
Foo foo = fooDAO.findByName(name).orElseGet(() -> fooDAO.addFoo(name));
将 Optional.orElseGet 与 lambda 表达式一起使用:
Optional<Foo> optionalFoo = fooDAO.findByName(name);
Foo foo = optionalFoo.orElseGet(()->fooDAO.addFoo(name));