我的代码中有以下内容:
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));
这导致测试失败,因为无论fooDAO.addFoo(name)
是否为空,都会调用Optional
,如果addFoo
已经存在,则不应运行Foo
中的逻辑。
除非有必要,否则可以在不调用fooDAO.addFoo(name)
的情况下在功能上重写原始块?
您正在寻找orElseGet
,它接受仅在值不存在时调用的Supplier
:
Foo foo = fooDAO.findByName(name)
.orElseGet(() -> fooDAO.addFoo(name));
我认为name
需要有效地最终才能实现。
将Optional.orElseGet与lambda表达式一起使用:
Optional<Foo> optionalFoo = fooDAO.findByName(name);
Foo foo = optionalFoo.orElseGet(()->fooDAO.addFoo(name));
orElse
将值作为参数,因此您传递的函数始终执行。
要在必要时创建foo
,你应该使用orElseGet
:
Foo foo = fooDAO.findByName(name).orElseGet(() -> fooDAO.addFoo(name));