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区别及 ...
随机推荐
- 一千行MySQL学习笔记 (转)
出处: 一千行MySQL学习笔记 /* 启动MySQL */ net start mysql /* 连接与断开服务器 */ mysql -h 地址 -P 端口 -u 用户名 -p 密码 /* 跳过权 ...
- 自定义字段的设计与实现(Java实用版)
前言 自定义字段又叫做"开放模型",用户可以根据自已的需求,添加需要的字段,实现个性化定制. 使用自定义字段的目的,使用自定义字段解决哪些问题 如现有一套CRM系统,客户模块中客户 ...
- oracle服务端字符集
一.oracle服务端字符集 SQL> select userenv('language') from dual ; USERENV('LANGUAGE')------------------- ...
- 实验吧flag整理
奇怪的短信 flagissimple 围在栅栏里的爱ILOVESHIYANBAR. 古典密码flag:CTF{COULDYOUEXCHANGETHEINFORMATION} The Flash-14F ...
- maven学习之路三
我们在写代码的时候,有些项目会有重复代码,或者是重复项目结构,这样我们就可以用maven 生成一个项目的基本骨架,就像我之前介绍的哪个logindemo一样继承了webApp-achetype一样.我 ...
- const与constexpr
关于const型数据,谭浩强老爷子这么总结道: Time const t; //t是常对象,其值在任何情况下都不能改变 void Time::fun()const; //fun是Time类中的常成员函 ...
- highcharts的基本使用(转载)
1 概述 Highcharts是一个跨浏览器的JavaScript图表控件,支持柱状图.趋势图.面积图.饼图.环形图.组合图.堆积图.散点图. Highcharts图表的基本功能,只需要引入两个JS类 ...
- glViewport函数用法
一. 其函数原型为glViewport(GLint x,GLint y,GLsizei width,GLsizei height) x,y 以像素为单位,指定了窗口的左下角位置. width,heig ...
- 采用线性回归方法降低双目测距到平面的误差(sklearn)
继上篇,为了改善标定板的深度信息: remove_idx1 = np.where(Z <= 0) remove_idx2 = np.where(Z > 500)#将Z轴坐标限定在0-500 ...
- 解决c#distinct不好用的问题
当一个结合中想根据某一个字段做去重方法时使用以下代码 IQueryable 继承自IEnumerable 先举例: #region linq to object List<People> ...