我需要对此进行清楚的解释,即使我读过这篇文章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(使用前将#替换为@)