当我需要使用Optional.orElseGet()而不是Optional.orElse()时

2023-12-28

我需要对此进行清楚的解释,即使我读过这篇文章link https://stackoverflow.com/questions/33170109/difference-between-optional-orelse-and-optional-orelseget存在差异,但没有明确的清晰度。那么有人可以用代码向我简要解释一下吗?


我想我开始理解你的问题了。执行顺序与Optional可能与我们在过程编程中习惯的不同(对于 Java 流和其他使用 lambda 的代码也是如此)。

我将使用以下两个例子尤金的回答 https://stackoverflow.com/a/44261755/5772882:

    o1.orElse(new MyObject()); // 1055e4af 

这是普通的旧 Java:它是对orElse() taking new MyObject()作为论证。因此,首先评估该参数,然后计算一个新的MyObject创建的。然后将其传递给orElse(). orElse()查看值是否存在于Optional;如果是,则返回该值(丢弃新创建的对象);如果不是,则返回参数中赋予它的对象。这是一个更简单的例子。

    o1.orElseGet(() -> {
        System.out.println("Should I see this");
        return new MyObject();
    });

我们再次进行带有一个参数的方法调用,并且再次首先评估该参数。 lambda 仅作为供应商创建和传递。里面的代码{ }还没有执行(你也看不到Should I see this在尤金的输出中)。再次orElseGet查看是否存在值Optional。如果有,则返回该值并忽略我们传递的供应商。如果没有,则调用供应商,里面的代码{ }执行以获取要返回的值orElseGet().

在第一种情况下,人们可能会说MyObject被创造和浪费。在第二个Supplier被创造和浪费。在这两种情况下,您得到的回报都是简洁且空指针安全的代码。所以很多时候,选择哪一个并不重要。如果创建MyObject如果成本高昂或具有不需要的副作用,您当然会想要第二个版本,其中对象仅在需要时才创建,并且永远不会浪费。 Eugene 在评论中提到了返回对象来自数据库调用的情况。数据库调用通常非常耗时,您不想无缘无故地进行一次数据库调用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当我需要使用Optional.orElseGet()而不是Optional.orElse()时 的相关文章

随机推荐