0

我的代码中有以下内容:

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)除非有必要,否则是否可以在不调用的情况下重写原始块?

4

3 回答 3

3

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

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

我认为这name需要有效地最终才能发挥作用。

于 2018-08-28T15:13:59.927 回答
3

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

Optional<Foo> optionalFoo = fooDAO.findByName(name);
Foo foo = optionalFoo.orElseGet(()->fooDAO.addFoo(name));
于 2018-08-28T15:15:22.350 回答
1

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

foo如有必要,要创建,您应该使用orElseGet

Foo foo = fooDAO.findByName(name).orElseGet(() -> fooDAO.addFoo(name));
于 2018-08-28T15:14:24.970 回答