Java9新特性Java.util.Optional优化与增强解析
目录
- 一、Java9的ifPresentOrElse(Consumer,Runnable)
- 1.1.Java9中的增强
- 1.2.回顾一下Java8中的写法
- 二、Java9的Optional.or(Supplier)
- 三、Java9的Optional.stream()
文章图片
我计划在后续的一段时间内,写一系列关于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以上就是Java9新特性Java.util.Optional优化与增强解析的详细内容,更多关于Java9新特性Optional增强的资料请关注脚本之家其它相关文章!
7
推荐阅读
- java9新特性Collection集合类的增强与优化方法示例
- Java9新特性Stream流API优化与增强
- CIS 2021网络安全创新大会《代码安全体系建设》实录
- Java9版本新特性同一个Jar支持多JDK版本运行
- 全面解读亚马逊云科技Private 5G的革新理念
- Visual|Visual Studio 2022最新版安装教程(图文详解)
- vue history路由模式下ios微信分享首次签名失败,二次刷新后成功
- StarRocks 2.1 新版本特性介绍
- 本书适合Python 程序员、数据分析人员《Python机器学习实践指南》(好书分享更新中)
- 2022年3月 新一期 NEAR认证开发者中文课程