使用OPtional的orElse()问题
来源:互联网 发布:杀出矩阵 编辑:程序博客网 时间:2024/06/02 05:09
使用OPtional的orElse()问题
项目中有这样一段代码:
return Optional.ofNullable(service.A()).orElse(service.B())
功能显而易见,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()));}printsB()...AA
看了上面代码,我就把我的代码改成如下即可:
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#
阅读全文
0 0
- 使用OPtional的orElse()问题
- 优雅的使用optional
- Vb.net 的 OrElse
- 关于使用java Optional遇到的一些问题
- Optional优雅的使用null
- Boost.Optional 的定义与使用
- 使用 Java 8 Optional 的正确姿势
- 使用 Java8 Optional 的正确姿势
- 使用 Java8 Optional 的正确姿势
- [Java编程教程]Optional的正确使用
- 使用java 8 Optional 的正确姿势
- Java8 中Optional类的使用
- AndAlso,OrElse和And,Or的区别
- AndAlso,OrElse和And,Or的区别
- AndAlso,OrElse和And,Or的区别
- AndAlso,OrElse和And,Or的区别
- AndAlso,OrElse和And,Or的区别
- AndAlso,OrElse和And,Or的区别
- Game Plug-ins(2)
- Oracle之分页查询
- python的if判断语句
- Java十进制转换为二进制、八进制、十六进制
- 【python 数据可视化】pyecharts的使用
- 使用OPtional的orElse()问题
- petalinux::执行子进程“oe-gnome-terminal-phonehome”失败(没有那个文件或目录)
- linux top
- HTML 表格元素
- 想申请用户体验设计实习?先看这六大建议!
- 梯度下降法
- Game Plug-ins(1)
- 判断一个树是否是另一个树的子树
- Oracle笔记七:数据更新、事务处理、数据伪列