java – 当我需要在Optional.orElse()上使用Optional.orElseGet()时

前端之家收集整理的这篇文章主要介绍了java – 当我需要在Optional.orElse()上使用Optional.orElseGet()时前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_301_0@
我需要对此做出明确的解释,即使我在阅读这篇关于差异的 link但没有明确的清晰度.所以任何人都可以用代码向我解释这一点.

解决方法

我想我开始明白你的问题.带有Optional的执行顺序可能与我们在过程式编程中使用的顺序不同(Java流和使用lambdas的其他代码也是如此).

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

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

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

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

我们再次使用一个参数进行方法调用,并再次首先计算参数. lambda仅作为供应商创建和传递. {}内的代码尚未执行(你也看不到我是否应该在Eugene的输出中看到这个).再次,orElseGet会查看Optional中是否存在值.如果有,则返回该值,并忽略我们传递的供应商.如果没有,则调用供应商,执行{}内的代码获取从orElseGet()返回的值.

在第一种情况下,可以说创建和浪费了MyObject.第二,创建和浪费了供应商.你得到的回报是两种情况下的简洁和空指针安全代码.所以你选择哪一个并不重要.如果创建MyObject代价高昂或者有不必要的副作用,那么您当然需要第二个版本,其中对象仅在被请求时创建,并且永远不会浪费.评论中的Eugene提到了返回的对象来自数据库调用的情况.数据库调用通常非常耗时,您不希望出于任何目的.

猜你在找的Java相关文章