我计划在后续的一段时间内,写一系列关于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优化与增强 - 字母哥博客 - 博客园相关推荐

  1. 视频教程-Java学习指南(Swing高级篇)-Java

    Java学习指南(Swing高级篇) 邵发,清华大学毕业,从业软件开发十余年,自2015年起致力于C/C++/Java等基础教育领域,希望能通过提高每一个个体的素质来推动中国IT业的整体发展.代表作: ...

  2. 明翰Java入门教学系列之IO篇

    复习 1.线程的同步与通信有几种方式? 2.创建线程有几种方式? 3.什么是方法重写与方法重载? 4.线程与进程的区别? 5.如何最高效的遍历Map? 6.线程的状态与生命周期? 7.HashTabl ...

  3. java负数右移_收入囊中篇---Java程序基础(二)

    前言: 本篇是接着上一篇更新的,如果没有阅读上一篇的话,可以查阅或回顾一下. 1.收入囊中篇---Java基础必备知识(一) 2.收入囊中篇---Java程序基础(二) Java程序基础目录 1.Ja ...

  4. Java多线程干货系列—(一)Java多线程基础

    前言 多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程并发编程对我们来说极其重要,下面跟我一起开启本次的学习之旅吧. 正文 线程与进程 1 线程:进程中负责程序执行的 ...

  5. Java面试题系列【1】JAVA初级经典五十问

    有道无术,术尚可求,有术无道,止于术. 资料整理来自网络 文章目录 1. JDK.JRE.JVM 有什么区别 2. == 和 equals 有什么区别 3. String类可以被继承吗? 4. Str ...

  6. 微服务 java9模块化_Java9系列第8篇-Module模块化编程

    我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还是有很多的特性值得关注.期待您能关注我,我将把java 9 ...

  7. java8模块化_Java9系列第8篇-Module模块化编程

    我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还是有很多的特性值得关注.期待您能关注我,我将把java 9 ...

  8. Java深海拾遗系列(10)--- Java并发之AQS源码分析

    AQS 全称是 AbstractQueuedSynchronizer,顾名思义,是一个用来构建锁和同步器的框架,它底层用了 CAS 技术来保证操作的原子性,同时利用 FIFO 队列实现线程间的锁竞争, ...

  9. Java入门教程系列【1】Java基本数据类型 小白必入系列

    记忆小提示: 位数=字节*8 (因此我们只需要记住所占字节就行了) 四个整数型从小到大依次为(后一种为前一种的2倍): byte(1个字节)-> short(2个字节)->int(4个字节 ...

最新文章

  1. mysql 执行计划详解_mysql explain执行计划详解
  2. cakephp对数据库的增删改查
  3. CSS3属性之多栏布局column
  4. 公文字体字号标准2020_零秒处理公文格式的三个要点
  5. Why settype table is used in Genil component implementation
  6. GridView控件RowDataBound事件中获取列字段值的几种途径
  7. datareader对象转化为int_【Angew. Chem. Int. Ed.】光催化丙二烯的去消旋反应
  8. 详解CNN五大经典模型:Lenet,Alexnet,Googlenet,VGG,DRL
  9. python中bar是什么_python-如何添加一个单独的colobar,它将显示来...
  10. AgileEAS.NET 4.0 重构裁剪后的程序集说明
  11. HTML 标签的 enctype 属性
  12. python 姓名转拼音
  13. 画基因结构图 gggenes 用法
  14. 林辉高考机器人_“成都造”高考机器人 高考数学成绩稳定在136分
  15. 小米只能进fastboot(bl已解)怎么办
  16. 用通俗易懂的方式讲解:决策树模型及案例(Python 代码)
  17. 虚幻5新特性之EnhancedInput
  18. 量子通信——量子的概念与量子力学
  19. 2.3软件测试与软件开发的关系
  20. HGE编写游戏的心得体会

热门文章

  1. 获取滚动条距离底部的高度
  2. 关于div容器高度随着浏览器宽度按照宽高比自适应的问题(css解决方案)
  3. installEventFilter、eventFilter函数理解
  4. iOS库--.a与.framework
  5. 网易笔试编程题java_2017年网易校招笔试JAVA研发编程题
  6. 【对讲机的那点事】450MHz模拟无线列调的工作原理(连载五)
  7. 绝对定位多个字居中显示的css
  8. virtualbox Linux与Windows共享文件
  9. CCNA考试中实验题精讲(RIP,OSPF,VLAN)
  10. sulime text 常用快捷键总结