Java9新特性Java.util.Optional优化与增强解析
作者:字母哥哥 发布时间:2022-08-17 02:34:15
我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还是有很多的特性值得关注。期待您能关注我,我将把java 9 写成一系列的文章,大概十篇左右,本文是第7篇。
java9在interface中定义私有方法详解
java9版本特性资源自动关闭的语法增强
Java9版本新特性同一个Jar支持多JDK版本运行
java9新特性Reactive Stream响应式编程 API
java9新特性Collection集合类的增强与优化方法示例
Java9新特性Stream流API优化与增强
Java9新特性Module模块化编程示例演绎
Java9新特性对HTTP2协议支持与非阻塞HTTP API
java.util.Optional
是在Java 8版本中新增的类,一定程度上可以改善编程过程中的NullPointException的问题。在Java 9中对这个类新增了一些方法进行增强,下面我们一起来看一下,顺便也回顾一下在Java 8中它的用法。
一、Java9的ifPresentOrElse(Consumer,Runnable)
1.1.Java 9 中的增强
如果存在值,则此新方法将执行给定的Consumer操作,否则运行给定的Runnable操作。下面的代码先使用Java 8的的Stream流过滤3的倍数,然后通过findFirst找到第一个3的倍数。如果找到一个这样的值,就print控制台打印出来;如果没找到一个这样的值,就输出"没有找到3的倍数"
ifPresentOrElse(Consumer,Runnable)的语义可以解释为:ifPresent就Consumer,OrElse就Runnable。这是Java 9 才有的增强方法。
IntStream.of(1, 2, 4)
.filter(i -> i % 3 == 0)
.findFirst()
.ifPresentOrElse(System.out::println, () -> {
System.out.println("没有找到3的倍数");
});
在1、2、4中没有3的倍数,所以输出结果如下
没有找到3的倍数
如果是下面的2、6、8数组被过滤,最终控制台输出结果为:6
IntStream.of(2, 6, 8)
.filter(i -> i % 3 == 0)
.findFirst()
.ifPresentOrElse(System.out::println, () -> {
System.out.println("没有找到3的倍数");
}); // 6
1.2.回顾一下Java 8中的写法
Java 8 Optional.isPresent():
如果使用Java 8 ,没有ifPresentOrElse(Consumer,Runnable)
方法,上文中同样的代码你应该是这样写的:自己去写if和else进行判断。同样输出:没有找到3的倍数
OptionalInt opt = IntStream.of(1, 2, 4)
.filter(i -> i % 3 == 0)
.findFirst();
if (opt.isPresent()) {
System.out.println(opt.getAsInt());
} else {
System.out.println("没有找到3的倍数");
}
Java 8 Optional.ifPresent():
ifPresent()
方法在值不存在的时候,没有提供一个可选的操作。所以下面的代码在执行之后,没有orElse动作,没有任何输出,这样不是很友好。
IntStream.of(1, 2, 4)
.filter(i -> i % 3 == 0)
.findFirst()
.ifPresent(System.out::println);
Java 8 Optional.orElse():
orElse()
方法在value返回值为空的之后,给出一个默认值。下文代码中给出一个默认值-1。
int result = IntStream.of(1, 2, 4)
.filter(i -> i % 3 == 0)
.findFirst()
.orElse(-1);
System.out.println(result); //-1
二、Java9的Optional.or(Supplier)
该方法在找不到值的时候,生成一个新的Optional出来。下文代码过滤数组[‘a’, ‘b’, ‘c’],isDigit判断数组中是否有数字字符,明显没有,所以findFirst找不到一个这样的值。所以生成一个默认值: Optional.of('0')
char digit = Stream.of('a', 'b', 'c')
.filter(e -> Character.isDigit(e))
.findFirst()
.or(() -> Optional.of('0')).get();
System.out.println(digit); //0
Java8 中的 orElseGet()
Java 8中的Optional.orElseGet()
方法也具备同样的功能。下文代码过滤数组[‘a’, ‘b’, ‘c’],isDigit判断数组中是否有数字字符,明显没有,所以findFirst找不到一个这样的值。所以通过orElseGet获取一个默认值: '0'
char result = Stream.of('a', 'b', 'c')
.filter(c -> Character.isDigit(c))
.findFirst()
.orElseGet(()->'0');
System.out.println(result); //0
三、Java9的Optional.stream()
在本例中Optional.stream()
方法返回仅包含一个最大值元素的Stream流。如果该值不存在,则返回空Stream:
OptionalInt opt1 = IntStream.of(2, 5, 6).max(); //求最大值
OptionalInt opt2 = IntStream.of(1, 3, 7).max(); //求最大值
IntStream.concat(opt1.stream(), opt2.stream()) //将2个流合并
.forEach(System.out::println); //将合并后的流数据打印
控制台输出的结果如下:
6
7
来源:https://zimug.blog.csdn.net/article/details/109173363


猜你喜欢
- 一、问题描述使用百度地图实现如图所示应用,首先自动定位当前我起始位置(小圆点位置),并跟随移动不断自动定位我的当前位置百度Api不同版本使用
- java 出现Zipexception 异常的解决办法1 异常描述在从 SVN 检出项目并配置完成后,启动 Tomcat 服务器,报出如下错
- 案例需求:访问带有验证码的登录页面login.jsp用户输入用户名,密码以及验证码。如果用户名和密码输入有误,跳转登录页面,提示:用户名或密
- 1 Mybatis-Plus简介Mybatis-Plus 提供了多种方式来执行 SQL,包括使用注解、XML 映射文件和 Lambda 表达
- 前言在项目开发中,日志系统是必不可少的,用AOP在Web的请求做入参和出参的参数打印,同时对异常进行日志打印,避免重复的手写日志,完整案例见
- 以下是tcp socket客户端和服务端源码,代码简单大家参考使用吧Tcp Server#include <WinSock2.h>
- 介绍:unity界面开发,会用到很多导航的按钮,他们是公共的,单击其中一个按钮,显示对应的界面。unity中,UGUI自带Toggle组件,
- 首先我们都知道java中的比较都是同一类对象与对象之间的比较,就好像现实生活中比较人和人的年龄一样,你不会去把人的年龄和人的身高来比较,这显
- 在用HTML5做跨平台应用开发时,尝尝会用到java和js方法互调的问题,对初学者而言,可能会有点难,在这里分享一些自己在实际开发过程中的用
- 这篇文章主要介绍了如何使用Spring工具类动态匹配url,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要
- 一、项目简述功能包括: 登录注册,办理借阅。借阅记录,预约借阅,借出未还, 借阅逾期,学生管理,图书管理,书库分类查询搜索。二、项目运行环境
- 本文实例讲述了C#递归实现回文判断算法,分享给大家供大家参考。具体实现方法如下:static void Main(string[] args
- 这是一个可以从乱码文本中得到正确的原始文本的程序,其基于的原理在于错误的编码往往导致位补充,因此正确的文本使用的字节数应该是最少的(之一)。
- 上周,公司的项目改版要求加上一个右滑返回上一个界面,于是就在网上找了一些开源库打算实现.但是在使用的时候遇见了许多的问题.试了两天用过 ht
- 通常在 java 中对文本、网络资源等操作起来是很繁杂的,要声明,读取,关闭三个阶段,还得考虑异常情况。假设我们要读取一段文本显示到控制台,
- 本文实例为大家分享了convinientbanner顶部广告轮播控件的具体代码,供大家参考,具体内容如下gradle中添加compile &
- 目录一.数组的基本概念二.数组的声明三.数组的创建及初始化1.数组的创建2.数组的初始化四.访问数组元素五.for each 循环六.数组的
- 1 二叉排序树的概述本文没有介绍一些基础知识。对于常见查找算法,比如顺序查找、二分查找、插入查找、斐波那契查找还不清楚的,可以看这篇文章:常
- java中引用数据类型有哪些Java中有俩种数据类型,其中主要有8中基本数据类型和引用数据类型,除了8中基本数据类型以外都是引用数据类型,8
- 前言首先,事务这个概念是数据库层面的,Spring只是基于数据库中的事务进行扩展,以及提供了一些能让程序员更新方便操作事务的方式Spring