从 Optional 功能重写赋值,而无需执行"else"逻辑



我的代码中有以下内容:

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));

最新更新