从Optional执行功能重写赋值而不执行“else”逻辑

问题描述 投票:0回答:3

我的代码中有以下内容:

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)的情况下在功能上重写原始块?

java optional functional-java
3个回答
3
投票

您正在寻找orElseGet,它接受仅在值不存在时调用的Supplier

Foo foo = fooDAO.findByName(name)
    .orElseGet(() -> fooDAO.addFoo(name));

我认为name需要有效地最终才能实现。


3
投票

将Optional.orElseGet与lambda表达式一起使用:

Optional<Foo> optionalFoo = fooDAO.findByName(name);
Foo foo = optionalFoo.orElseGet(()->fooDAO.addFoo(name));

1
投票

orElse将值作为参数,因此您传递的函数始终执行。

要在必要时创建foo,你应该使用orElseGet

Foo foo = fooDAO.findByName(name).orElseGet(() -> fooDAO.addFoo(name));
© www.soinside.com 2019 - 2024. All rights reserved.