我的代码中有以下内容:
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)
,并且如果Foo
已存在,则不应运行addFoo
中的逻辑。
除非必要,否则是否可以在不调用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));