加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-14 23:23:12 所属栏目:Java 来源:网络整理
导读:我需要对此做出明确的解释,即使我在阅读这篇关于差异的 link但没有明确的清晰度.所以任何人都可以用代码向我解释这一点. 解决方法 我想我开始明白你的问题.带有Optional的执行顺序可能与我们在过程式编程中使用的顺序不同(Java流和使用lambdas的其他代码也是
我需要对此做出明确的解释,即使我在阅读这篇关于差异的 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提到了返回的对象来自数据库调用的情况.数据库调用通常非常耗时,您不希望出于任何目的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读