使用OPtional的orElse()问题

项目中有这样一段代码:

return Optional.ofNullable(service.A()).orElse(service.B())
  • 1

功能显而易见,service.A()如果返回值是null,则返回service.B(),否则直接返回service.A()。

实际使用中发现:

如果service.A()返回非null,最终结果是service.A(),然而service.B()这个方法也被执行了。这样肯定就不对了,如果service.B()中还有插入数据库或者RPC这种操作,问题就大了。刚开始还以为是什么执行顺序问题,后来在Stack Overflow上看到老外讨论orElse()和orElseGet()的区别,其中一点区别就是orElse(T)无论前面Optional容器是null还是non-null,都会执行orElse里的方法,orElseGet(Supplier)并不会,如果service无异常抛出的情况下,Optional使用orElse或者orElseGet的返回结果都是一样的

stack overflow上有人还给出这样一个例子

static String B() {
System.out.println("B()...");
return "B";
} public static void main(final String... args) {
System.out.println(Optional.of("A").orElse(B()));
System.out.println(Optional.of("A").orElseGet(() -> B()));
}
prints
B()...
A
A

看了上面代码,我就把我的代码改成如下即可:

return Optional.ofNullable(service.A()).orElseGet(() -> service.B())

结论:Optional的orElse(T)若方法不是纯计算型的,有与数据库交互或者远程调用的,都应该使用orElseGet()

附stack overflow地址:

https://stackoverflow.com/questions/33170109/difference-between-optional-orelse-and-optional-orelseget#

  Options : History : Feedback : Donate Close

使用OPtional的orElse()问题的更多相关文章

  1. Java Optional orElse() 和 orElseGet() Optional.flatMap()和Optional.map()区别

    Java Optional 的 orElse() 和 orElseGet() 的区别 1. 接收的参数不同 orElse()方法以一个自定义类型的数据作为参数 public T orElse(T t) ...

  2. (八)jdk8学习心得之Optional类

    八.Optional 类 1. 作用:可以存放空指针null,主要用于解决空指针问题. 2. 使用方法 1) 创建对象(2种方法) Optional optional = Optional.of(非n ...

  3. Java8 Optional类

    概述 到目前为止,著名的NullPointerException是导致Java应用程序失败的最常见原因.过去,为了解决空指针异常,Google公司著名的Guava项目引入了Optional类,Guav ...

  4. Optional 的基本用法

    参考: https://www.cnblogs.com/xingzc/p/5778090.html http://www.runoob.com/java/java8-optional-class.ht ...

  5. java1.8新特性(optional 使用)

    经常在程序中出现 java.lang.NullPointerException  为了避免  报错,总是要进行一些 是否为null 的if else 判断 ,1.8 可以使用optional 类 来简 ...

  6. java8新特性之Optional类

    NullPointException可以说是所有java程序员都遇到过的一个异常,虽然java从设计之初就力图让程序员脱离指针的苦海,但是指针确实是实际存在的,而java设计者也只能是让指针在java ...

  7. 乐字节Java8核心特性之Optional类

    大家好啊,上次小乐给大家介绍了Java8最最重要的一个特性——Stream流,点击可以回顾哦. Optional<T>类(java.util.Optional)是一个容器类,代表一个值存在 ...

  8. Java 8 Optional类使用的实践经验

    前言 Java中空指针异常(NPE)一直是令开发者头疼的问题.Java 8引入了一个新的Optional类,使用该类可以尽可能地防止出现空指针异常. Optional 类是一个可以为null的容器对象 ...

  9. 使用Optional摆脱NPE的折磨

    在目前的工作中,我对Java中的Stream和Lambda表达式都使用得很多,之前也写了两篇文章来总结对应的知识. 024:Java流实现Shell:cat 1.log | grep a | sort ...

随机推荐

  1. customs event

    // First create the event var myEvent = new CustomEvent("userLogin", { detail: { username: ...

  2. poj1113凸包

    就是求凸包的周长加以l为半径的圆周长,证明略 由于之前写过叉积,所以graham扫描算法不是很难理解 #include<map> #include<set> #include& ...

  3. day36 爬虫+http请求+高性能

    爬虫 参考博客:http://www.cnblogs.com/wupeiqi/articles/5354900.html http://www.cnblogs.com/wupeiqi/articles ...

  4. S16 day7 socket

    网络基础之网络协议篇:http://www.cnblogs.com/linhaifeng/articles/5937962.html 参考博客:http://www.cnblogs.com/linha ...

  5. laravel中修改默认时区

    在config文件夹下app.php中找到timezone,有RTC改成PRC

  6. [感悟]马士兵Java自学之路——(精华版)

    JAVA自学之路 一: 学会选择 为了就业,不少同学参加各种各样的培训. 决心做软件的,大多数人选的是java,或是.net,也有一些选择了手机.嵌入式.游戏.3G.测试等. 那么究竟应该选择什么方向 ...

  7. CentOS 6.5 升级内核到 3.10.28

    本文适用于CentOS 6.4, CentOS 6.5,亲测可行,估计也适用于其他Linux发行版. 1. 准备工作 1.1 下载源码包 Linux内核版本有两种:稳定版和开发版 ,Linux内核版本 ...

  8. vue单独给页面设置body属性

    因项目需求:用户个人详细信息页面设置背景色,之前在这个页面设置最外层div发现不行.因为app.vue影响了它.后来直接在页面上用body设置样式,发现影响了其他页面. 后来想了通过vue的生命周期来 ...

  9. 2018.11 企业战略课堂笔记2 SWOT-4C战略

    1因素列表 2分析过程 :重要的是逻辑推理过程 3  4C战略

  10. New Concept English there (3)

    25words/ minutes Some time ago,an interesting discovery was made by archaeologists on the Aegean isl ...