Java9新特性Java.util.Optional优化与增强解析

 更新时间:2022年03月15日 16:48:43   作者:字母哥哥  
这篇文章主要为大家介绍了Java9新特性Java.util.Optional优化与增强使用说明解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步

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

java9在interface中定义私有方法详解

java9版本特性资源自动关闭的语法增强

Java9版本新特性同一个Jar支持多JDK版本运行

java9新特性Reactive Stream响应式编程 API

java9新特性Collection集合类的增强与优化方法示例

Java9新特性Stream流API优化与增强

Java9新特性Module模块化编程示例演绎

Java9新特性对HTTP2协议支持与非阻塞HTTP API

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

以上就是Java9新特性Java.util.Optional优化与增强解析的详细内容,更多关于Java9新特性Optional增强的资料请关注脚本之家其它相关文章!

相关文章

  • win10 eclipse配置环境变量的教程图解

    win10 eclipse配置环境变量的教程图解

    本文通过图文并茂的形式给大家介绍了win10 eclipse配置环境变量的方法,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧
    2018-07-07
  • 使用 Apache POI 在 Java 中写入 Excel 文件的方法

    使用 Apache POI 在 Java 中写入 Excel

    这篇文章详细介绍了如何使用ApachePOI在Java中编写Excel文件的技巧,包括创建工作簿、工作表、行和单元格,以及如何处理不同版本的Excel文件,通过详细的步骤和代码示例,读者可以快速掌握ApachePOI的基本使用方法,感兴趣的朋友一起看看吧
    2025-02-02
  • spring boot中内嵌redis的使用方法示例

    spring boot中内嵌redis的使用方法示例

    这篇文章主要给大家介绍了关于spring boot中内嵌redis使用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-06-06
  • MyBatis Plus整合Redis实现分布式二级缓存的问题

    MyBatis Plus整合Redis实现分布式二级缓存的问题

    Mybatis内置的二级缓存在分布式环境下存在分布式问题,无法使用,但是我们可以整合Redis来实现分布式的二级缓存,这篇文章给大家介绍MyBatis Plus整合Redis实现分布式二级缓存,感兴趣的朋友跟随小编一起看看吧
    2023-11-11
  • RocketMQ生产者如何规避故障Broker方式详解

    RocketMQ生产者如何规避故障Broker方式详解

    这篇文章主要为大家介绍了RocketMQ生产者如何规避故障Broker方式详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • Java中FileWriter类的常用方法说明

    Java中FileWriter类的常用方法说明

    这篇文章主要介绍了Java中FileWriter类的常用方法说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • SpringBoot如何从配置文件中读取配置参数

    SpringBoot如何从配置文件中读取配置参数

    这篇文章主要介绍了SpringBoot如何从配置文件中读取配置参数问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • servlet之web路径问题_动力节点Java学院整理

    servlet之web路径问题_动力节点Java学院整理

    这篇文章主要为大家详细介绍了servlet之web路径问题的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • ZooKeeper Java API编程实例分析

    ZooKeeper Java API编程实例分析

    本文主要通过实例给大家详细分析了ZooKeeper用JAVA实现API编程的知识要点。
    2017-11-11
  • SpringBoot AnnotationUtils工具类的使用实例详解

    SpringBoot AnnotationUtils工具类的使用实例详解

    这篇文章主要介绍了SpringBoot AnnotationUtils工具类的使用,使用自定义注解标记业务方法,原生Java获取注解及AnnotationUtils工具类获取方法,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-09-09

最新评论