java = 优化_Java9系列第7篇:Java.util.Optional优化与增强 - 字母哥博客 - 博客园
我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还是有很多的特性值得关注。期待您能关注我,我将把java 9 写成一系列的文章,大概十篇左右,本文是第7篇。
java9系列文章访问地址
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深入浅出系列》
java = 优化_Java9系列第7篇:Java.util.Optional优化与增强 - 字母哥博客 - 博客园相关推荐
- 视频教程-Java学习指南(Swing高级篇)-Java
Java学习指南(Swing高级篇) 邵发,清华大学毕业,从业软件开发十余年,自2015年起致力于C/C++/Java等基础教育领域,希望能通过提高每一个个体的素质来推动中国IT业的整体发展.代表作: ...
- 明翰Java入门教学系列之IO篇
复习 1.线程的同步与通信有几种方式? 2.创建线程有几种方式? 3.什么是方法重写与方法重载? 4.线程与进程的区别? 5.如何最高效的遍历Map? 6.线程的状态与生命周期? 7.HashTabl ...
- java负数右移_收入囊中篇---Java程序基础(二)
前言: 本篇是接着上一篇更新的,如果没有阅读上一篇的话,可以查阅或回顾一下. 1.收入囊中篇---Java基础必备知识(一) 2.收入囊中篇---Java程序基础(二) Java程序基础目录 1.Ja ...
- Java多线程干货系列—(一)Java多线程基础
前言 多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程并发编程对我们来说极其重要,下面跟我一起开启本次的学习之旅吧. 正文 线程与进程 1 线程:进程中负责程序执行的 ...
- Java面试题系列【1】JAVA初级经典五十问
有道无术,术尚可求,有术无道,止于术. 资料整理来自网络 文章目录 1. JDK.JRE.JVM 有什么区别 2. == 和 equals 有什么区别 3. String类可以被继承吗? 4. Str ...
- 微服务 java9模块化_Java9系列第8篇-Module模块化编程
我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还是有很多的特性值得关注.期待您能关注我,我将把java 9 ...
- java8模块化_Java9系列第8篇-Module模块化编程
我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还是有很多的特性值得关注.期待您能关注我,我将把java 9 ...
- Java深海拾遗系列(10)--- Java并发之AQS源码分析
AQS 全称是 AbstractQueuedSynchronizer,顾名思义,是一个用来构建锁和同步器的框架,它底层用了 CAS 技术来保证操作的原子性,同时利用 FIFO 队列实现线程间的锁竞争, ...
- Java入门教程系列【1】Java基本数据类型 小白必入系列
记忆小提示: 位数=字节*8 (因此我们只需要记住所占字节就行了) 四个整数型从小到大依次为(后一种为前一种的2倍): byte(1个字节)-> short(2个字节)->int(4个字节 ...
最新文章
- mysql 执行计划详解_mysql explain执行计划详解
- cakephp对数据库的增删改查
- CSS3属性之多栏布局column
- 公文字体字号标准2020_零秒处理公文格式的三个要点
- Why settype table is used in Genil component implementation
- GridView控件RowDataBound事件中获取列字段值的几种途径
- datareader对象转化为int_【Angew. Chem. Int. Ed.】光催化丙二烯的去消旋反应
- 详解CNN五大经典模型:Lenet,Alexnet,Googlenet,VGG,DRL
- python中bar是什么_python-如何添加一个单独的colobar,它将显示来...
- AgileEAS.NET 4.0 重构裁剪后的程序集说明
- HTML 标签的 enctype 属性
- python 姓名转拼音
- 画基因结构图 gggenes 用法
- 林辉高考机器人_“成都造”高考机器人 高考数学成绩稳定在136分
- 小米只能进fastboot(bl已解)怎么办
- 用通俗易懂的方式讲解:决策树模型及案例(Python 代码)
- 虚幻5新特性之EnhancedInput
- 量子通信——量子的概念与量子力学
- 2.3软件测试与软件开发的关系
- HGE编写游戏的心得体会
热门文章
- 获取滚动条距离底部的高度
- 关于div容器高度随着浏览器宽度按照宽高比自适应的问题(css解决方案)
- installEventFilter、eventFilter函数理解
- iOS库--.a与.framework
- 网易笔试编程题java_2017年网易校招笔试JAVA研发编程题
- 【对讲机的那点事】450MHz模拟无线列调的工作原理(连载五)
- 绝对定位多个字居中显示的css
- virtualbox Linux与Windows共享文件
- CCNA考试中实验题精讲(RIP,OSPF,VLAN)
- sulime text 常用快捷键总结