【问题标题】:Functionally rewriting assignment from an Optional without executing "else" logic在不执行“else”逻辑的情况下从 Optional 功能重写分配
【发布时间】:2018-08-28 15:07:14
【问题描述】:

我的代码中有以下内容:

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),除非有必要?

【问题讨论】:

  • @Leviand 我相信它调用fooDAO.addFoo(name) 是为了得到它的返回值,也就是传递给orElse的返回值

标签: java optional functional-java


【解决方案1】:

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

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

我认为name 需要有效地最终才能使其工作。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      orElse 接受一个值作为参数,所以你传递的函数总是被执行。

      如果需要创建foo,你应该使用orElseGet

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

      【讨论】:

        猜你喜欢
        • 2021-02-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-11
        • 2018-08-25
        • 1970-01-01
        相关资源
        最近更新 更多