Java9系列第7篇:Java.util.Optional优化与增强

我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还是有很多的特性值得关注。期待您能关注我,我将把java 9 写成一系列的文章,大概十篇左右,本文是第7篇。
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
欢迎关注我的博客,里面有很多精品合集
- 本文转载注明出处(必须带连接,不能只转文字):字母哥博客。
觉得对您有帮助的话,帮我点赞、分享!您的支持是我不竭的创作动力! 。另外,笔者最近一段时间输出了如下的精品内容,期待您的关注。
- 《手摸手教你学Spring Boot2.0》
- 《Spring Security-JWT-OAuth2一本通》
- 《实战前后端分离RBAC权限管理系统》
- 《实战SpringCloud微服务从青铜到王者》
- 《VUE深入浅出系列》
Java9系列第7篇:Java.util.Optional优化与增强的更多相关文章
- jdk8新特性:在用Repository实体查询是总是提示要java.util.Optional, 原 Inferred type 'S' for type parameter 'S' is not within its bound;
		jdk8新特性:在用Repository实体查询是总是提示要java.util.Optional 在使用springboot 方法报错: Inferred type 'S' for type para ... 
- Java 8 中的 java.util.Optional
		Java 8 中的 java.util.Optional 学习了:https://blog.csdn.net/sun_promise/article/details/51362838 package ... 
- java.util.Optional学习笔记
		java.util.Optional是Java 8新增的类,作为一个持有实例的容器类,可以帮我们把判空的代码写得更优雅,并且该类还提供了一些实用的api,官方文档在这里,接下来我们通过实战来学习吧: ... 
- Java-Class-FC:java.util.Optional
		ylbtech-Java-Class-FC:java.util.Optional 1.返回顶部 2.返回顶部 1.1. import java.util.Optional; 1.2.1. @Api ... 
- Java9系列第6篇-Stream流API的增强
		我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还是有很多的特性值得关注.期待您能关注我,我将把java 9 ... 
- Java9系列第8篇-Module模块化编程
		我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还是有很多的特性值得关注.期待您能关注我,我将把java 9 ... 
- 定时器篇---java.util.TimerTask和quartz
		最近项目中出现了定时执行任务的东西,研究了一下,觉得挺不错的,以后还用得到,就总结了下. 这里只介绍两种java.util.Timer 和 quartz java.util.Timer java自带的 ... 
- Java9系列第三篇-同一个Jar支持多JDK版本运行
		我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还是有很多的特性值得关注.期待您能关注我,我将把java 9 ... 
- java.util.Optional
		public class OptionalDemo { public static void main(String[] args) { //创建Optional实例,也可以通过方法返回值得到. Op ... 
随机推荐
- 用ajax获取后端数据,显示在前端,实现了基本计算器功能
			下午在看视频的时候,遇到一个问题:如何把后端 print_r或echo的数据显示在前端.百度了一下,说是用ajax,想着前一阵子学习了ajax,并且最近也想做一个计算器,于是就自己钻起来了. 计算器的 ... 
- SSM框架中,事务无法回滚的原因和解决
			原因: 由ServletContextListener加载spring配置文件产生的是父容器,springMVC产生的是子容器,子容器对Controller进行扫描装配时装配了@Service注解的实 ... 
- 关于java基础知识的面试题(一)
			1) Java中能否使用goto? 在C/C++中,goto常被用于跳出多重循环.但goto 语句的使用往往会使程序的可读性降低,所以 Java 不允许 goto 跳转.实际上,自从“goto有害论” ... 
- 关于浏览器访问iLO报错ERR_SSL_BAD_RECORD_MAC_ALERT
			公司有几台HP DL380 G7服务器,ilo版本是ilo3(Integrated Lights-Out 3),ilo口配置好后,无法正常打开ilo页面 ping ilo口是通的,并且telnet 8 ... 
- 趣图:我说自己菜 vs 大佬说自己菜
			扩展阅读 一大波趣图:CSS的力量 趣图:嫁人就嫁程序员,大妈都懂的! 趣图:向客户介绍的产品VS实际开发的产品 如何准备校招技术面试+一只小菜鸟的面试之路 向Spring大佬低头--大量源码流出 ... 
- Android如何使用注解进行代码检查
			原文首发于微信公众号:躬行之(jzman-blog),欢迎关注交流! Android Studio 内置了代码检查工具 Lint,可在菜单栏选择 Analyze > Inspect Code 执 ... 
- 《Java从入门到失业》第四章:类和对象(4.6):类路径
			4.6类路径 4.6.1什么是类路径 前面我们讨论过包,知道字节码文件最终都会被放到和包名相匹配的树状结构子目录中.例如上一节的例子: 其实类还有一种存放方式,就是可以归档到一个jar文件中,jar文 ... 
- git server“丢失”commit问题探究
			1 背景 gitlab某仓库有同事发现部分代码文件内容丢失,具体表现 A. dev分支commit信息是连续的,看不出明显的大时间范围批量丢失 B. 以SuncardCashier/control/C ... 
- java调用matlab生成exe文件
			一.Matlab生成Java Package 1.在MATLAB的Command Window输入deploytool命令,选择Library Compiler. 2.在弹出的窗口选择Java Pac ... 
- 温故知新----封装(struct)
			上次提到class是最常见的封装,今天发现别人开发的SDK里面有大量的结构体struct 转载: 1. https://blog.csdn.net/a_forever_dream/article/de ... 
