Java Optional orElse() 和 orElseGet() Optional.flatMap()和Optional.map()区别
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()区别的更多相关文章
- JDK8中`Optional.orElse()` 和`Optional.orElseGet()`之间的区别
看例子就明白了 ``` static String B() { System.out.println("B()..."); return "B"; } publ ...
- Java 8新特性(三):Optional类
在上一篇介绍Stream流式数据处理的文章中提到了Optional类,这是Java 8新增的一个类,用以解决程序中常见的NullPointerException异常问题.本篇文章将详细介绍Option ...
- Java开发笔记(七十七)使用Optional规避空指针异常
前面在介绍清单用法的时候,讲到了既能使用for循环遍历清单,也能通过stream流式加工清单.譬如从一个苹果清单中挑选出红苹果清单,采取for循环和流式处理都可以实现.下面是通过for循环挑出红苹果清 ...
- Java 中的集合接口——List、Set、Map
Java 中的集合接口——List.Set.Map 什么叫集合:集合就是Java API所提供的一系列类的实例,可以用于动态存放多个对象.这跟我们学过的数组差不多,那为什么我们还要学集合,我们看看数组 ...
- <Java中的继承和组合之间的联系和区别>
//Java中的继承和组合之间的联系和区别 //本例是继承 class Animal { private void beat() { System.out.println("心胀跳动...& ...
- 分享非常有用的Java程序 (关键代码)(五)---把 Array 转换成 Map
原文:分享非常有用的Java程序 (关键代码)(五)---把 Array 转换成 Map import java.util.Map; import org.apache.commons.lang.Ar ...
- JAVA反射中的getFields()方法和getDeclaredFields ()方法的区别
JAVA反射中的getFields()方法和getDeclaredFields ()方法的区别 关于获取类的字段有两种方式:getFields()和getDeclaredFields().我们先来 ...
- C、C++、C#、Java、php、python语言的内在特性及区别
C.C++.C#.Java.PHP.Python语言的内在特性及区别: C语言,它既有高级语言的特点,又具有汇编语言的特点,它是结构式语言.C语言应用指针:可以直接进行靠近硬件的操作,但是C的指针操作 ...
- java 常用集合list与Set、Map区别及适用场景总结
转载请备注出自于:http://blog.csdn.net/qq_22118507/article/details/51576319 list与Set.Map区别及 ...
随机推荐
- js日期相关方法
/** * ===================================== * 日期相关方法 * ===================================== */ ;(fu ...
- Codeforces 1228C. Primes and Multiplication
传送门 当然是考虑 $n$ 的每个质数 $p$ 对答案的贡献 考虑 $p^k$ 在 $[1,m]$ 中出现了几次,显然是 $\left \lfloor \frac{m}{p^k} \right \rf ...
- Task的取消
原文:.NET 4 并行(多核)编程系列之三 从Task的取消 .NET 4 并行(多核)编程系列之三 从Task的取消 前言:因为Task是.NET 4并行编程最为核心的一个类,也我们在是在并行编程 ...
- Linux(16):Shell编程(3)
vim 编程环境配置: .vimrc 文件配置如下:(.vimrc文件放到家目录下:/root :然后退出 xshell 再登陆进来xshell) set nocompatible set histo ...
- Mysql学习(三)之数据库管理工具Navicat
前言 mysql安装完后默认只有命令行工具,所以我们可以下载一些数据库管理工具Navicat Navicat使用 首先建立一个连接选择mysql,填写信息 发现多了一个localhost,双击,打开连 ...
- apply,call 和 bind 有什么区别
三者都可以把函数应用到其他对象上,不是自身对象,apply,call是直接执行函数调用,bind是绑定,执行需要再次调用,apply和call的区别是apply接受数组作为参数,而call是接受逗号分 ...
- 代码调试console对象的花式玩法
转自阮一峰http://www.ruanyifeng.com/home.html console.log(),console.info(),console.debug() console.log方法用 ...
- numpy中与高等数学有关的函数
1.方阵的迹 方阵的迹就是方阵的主对角线元素之和 # -*- coding:utf-8 -*- # @Author: WanMingZhu # @Date: 2019/8/12 9:37 import ...
- c++ 指定目录下的文件遍历
要实现指定目录下文件的遍历需要执行一下的部分: 第一步获取当前路径的名字:(MAX_PATH是在windows定义的所有的路径名字不超过其,调用该函数会使得得到当前的目录) #include < ...
- 多线程与UI操作(二)
为了让程序尽快响应用户操作,在开发Windows应用程序时经常会使用到线程.对于耗时的操作如果不使用线程将会是UI界面长时间处于停滞状态,这种情况是用户非常不愿意看到的,在这种情况下我们希望使用线程来 ...