Java Optional 的 orElse() 和 orElseGet() 的区别

1. 接收的参数不同

orElse()方法以一个自定义类型的数据作为参数

public T orElse(T t)

orElseGet()方法以一个Supplier类型的数据作为参数

public T orElseGet(Supplier<? extends T> other)

2. 程序的执行过程不同

以下面一段代码为例:

public static void main(String[] args) {
String[] names = new String[]{"zhang", "wang", "li", "zhao", "wu"};
Optional.of("wang").orElse(getRandomName(names)); // 执行该句时会打印"Generating a name..."
Optional.of("wang").orElseGet(() -> getRandomName(names));
} public static String getRandomName(String[] names) {
System.out.println("Generating a name...");
Random random = new Random();
return names[random.nextInt(5)];
}

在上述代码在运行Optional.of("wang").orElse(getRandomName(names))时会打印"Generating a name...",而在运行Optional.of("wang").orElseGet(() -> getRandomName(names))时没有任何输出,这说明了orElse()中的函数getRandomName被调用了,而orElseGet()中的Lambda表达式没有执行。

产生上述现象的原因是,无论Optional对象中的值是否为空,orElse()函数都会执行;而由于orElseGet()中的参数为一个Supplier方法,该方法的特点是仅在必要的时候执行,因此只有在Optional对象中的值为空时,orElseGet()中的Supplier方法才会执行。

3. 性能差异

由于orElse()orElseGet()执行过程的差异,orElseGet()方法的执行效率相对而言也更快,这是因为他会跳过不必要的方法调用。

因此,只有当默认值已经事先定义的情况下,才使用orElse(),否则使用orElseGet()更好

=================================================================================

使用map函数返回对象,使用flatMap返回Optional。例如:

public static void main(String[] args) {
Optional<String> s = Optional.of("input");
System.out.println(s.map(Test::getOutput));
System.out.println(s.flatMap(Test::getOutputOpt));
} static Optional<String> getOutputOpt(String input) {
return input == null ? Optional.empty() : Optional.of("output for " + input);
} static String getOutput(String input) {
return input == null ? null : "output for " + input;
}

这两个语句输出相同的东西。

Java Optional orElse() 和 orElseGet() Optional.flatMap()和Optional.map()区别的更多相关文章

  1. JDK8中`Optional.orElse()` 和`Optional.orElseGet()`之间的区别

    看例子就明白了 ``` static String B() { System.out.println("B()..."); return "B"; } publ ...

  2. Java 8新特性(三):Optional类

    在上一篇介绍Stream流式数据处理的文章中提到了Optional类,这是Java 8新增的一个类,用以解决程序中常见的NullPointerException异常问题.本篇文章将详细介绍Option ...

  3. Java开发笔记(七十七)使用Optional规避空指针异常

    前面在介绍清单用法的时候,讲到了既能使用for循环遍历清单,也能通过stream流式加工清单.譬如从一个苹果清单中挑选出红苹果清单,采取for循环和流式处理都可以实现.下面是通过for循环挑出红苹果清 ...

  4. Java 中的集合接口——List、Set、Map

    Java 中的集合接口——List.Set.Map 什么叫集合:集合就是Java API所提供的一系列类的实例,可以用于动态存放多个对象.这跟我们学过的数组差不多,那为什么我们还要学集合,我们看看数组 ...

  5. <Java中的继承和组合之间的联系和区别>

    //Java中的继承和组合之间的联系和区别 //本例是继承 class Animal { private void beat() { System.out.println("心胀跳动...& ...

  6. 分享非常有用的Java程序 (关键代码)(五)---把 Array 转换成 Map

    原文:分享非常有用的Java程序 (关键代码)(五)---把 Array 转换成 Map import java.util.Map; import org.apache.commons.lang.Ar ...

  7. JAVA反射中的getFields()方法和getDeclaredFields ()方法的区别

    JAVA反射中的getFields()方法和getDeclaredFields ()方法的区别   关于获取类的字段有两种方式:getFields()和getDeclaredFields().我们先来 ...

  8. C、C++、C#、Java、php、python语言的内在特性及区别

    C.C++.C#.Java.PHP.Python语言的内在特性及区别: C语言,它既有高级语言的特点,又具有汇编语言的特点,它是结构式语言.C语言应用指针:可以直接进行靠近硬件的操作,但是C的指针操作 ...

  9. java 常用集合list与Set、Map区别及适用场景总结

     转载请备注出自于:http://blog.csdn.net/qq_22118507/article/details/51576319                  list与Set.Map区别及 ...

随机推荐

  1. Codeforces 1194D. 1-2-K Game

    传送门 先考虑只能走 $1,2$ 步的情况,设 $p[i]$ 表示当 $n=i$ 时先手是否必胜 自己手玩一下发现 $p$ 就是 $011011011...011$ 这样循环(下标从 $0$ 开始,其 ...

  2. O021、创建 Image

    参考https://www.cnblogs.com/CloudMan6/p/5393376.html   本节演示如何通过 Web GUI 和 CLI 两种方法创建image.   OpenStack ...

  3. O016、搭建实验环境

    参考https://www.cnblogs.com/CloudMan6/p/5350536.html   在学习 OpenStack 各服务之前,需要先搭建一个实验环境.   一个看得到摸得着而且能让 ...

  4. ArcGis之popup列表字段自定义

    ArcGis之popup列表字段自定义 featureLayer图层中可以使用popupTemplate属性添加弹窗. API:https://developers.arcgis.com/javasc ...

  5. python中同步、多线程、异步IO、多线程对IO密集型的影响

    目录 1.常见并发类型 2.同步版本 3.多线程 4.异步IO 5.多进程 6.总结 1.常见并发类型 I/ O密集型: 蓝色框表示程序执行工作的时间,红色框表示等待I/O操作完成的时间.此图没有按比 ...

  6. Spring Boot整合dubbo(注解的方式)

    一.创建项目 1.创建一个空的项目 2.在空的项目中添加两个Spring Boot模块,如下图所示 二.在provider模块中的pom文件中添加依赖 <dependency> <g ...

  7. Linux上ssh免秘钥互登

    两台机器分别为:master:192.168.1.10sever1:192.168.1.20 1.检查机器名和连通性 a.查看/etc/hostname [root@master master]# m ...

  8. Logback日志输出到ELK

    用docker-compose本机部署elk docker-compose.yml version: "3" services: es01: image: docker.elast ...

  9. server version for the right syntax to use near 'USING BTREE 数据库文件版本不合导致的错误

    MySQL 返回:#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MyS ...

  10. zencart只有购买过此产品的客户才能评价产品

    当前登录的客户买过此产品时,才显示评价按钮: <?php $rev_query = "select count(*) as count from orders o ,orders_pr ...