gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:02:54 25 4
gpt4 key购买 nike

我需要对此有一个明确的解释,即使我读过这个 link关于差异但没有明确说明。那么任何人都可以用代码简单地向我解释一下吗?

最佳答案

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

我将使用 Eugene’s answer 中的两个示例:

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

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

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

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

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

关于java - 当我需要使用 Optional.orElseGet() 而不是 Optional.orElse(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44261253/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com