2020年10月20日星期二

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深入浅出系列》

原文转载:http://www.shaoqun.com/a/481310.html

智赢:https://www.ikjzd.com/w/1511

西集网:https://www.ikjzd.com/w/1353

telegram:https://www.ikjzd.com/w/1734


我计划在后续的一段时间内,写一系列关于java9的文章,虽然java9不像Java8或者Java11那样的核心java版本,但是还是有很多的特性值得关注。期待您能关注我,我将把java9写成一系列的文章,大概十篇左右,本文是第7篇。java9系列文章访问地址java.util.Optional是在Java8版本中新增的类,一定程度上可以改善编程过程中的NullPointException的问题。在
mav:https://www.ikjzd.com/w/2414
focalprice:https://www.ikjzd.com/w/1094.html
鳌头镇有稻草节吗?从化稻草农业公园好耍不?:http://tour.shaoqun.com/a/33118.html
地心漂流网上订票?阳山地心漂流预约多少钱?:http://tour.shaoqun.com/a/57693.html
南昌万达主题乐园什么时候开业,南昌万达乐园在哪:http://tour.shaoqun.com/a/35808.html

没有评论:

发表评论