在不执行 "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));