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

作者:字母哥哥 时间:2022-08-17 02:34:15 

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

来源:https://zimug.blog.csdn.net/article/details/109173363

标签:Java9,新特性,Optional,增强
0
投稿

猜你喜欢

  • 详解在LINUX上部署带有JAR包的JAVA项目

    2022-12-30 21:07:14
  • 一文带你入门SpringMVC的配置与使用

    2021-06-24 12:30:52
  • Java中通过Class类获取Class对象的方法详解

    2021-11-09 17:12:57
  • Java中包装类和Arrays类的详细介绍

    2023-12-03 22:04:13
  • C语言时间函数之strftime()详解

    2023-06-26 02:42:32
  • java synchronized的用法及原理详解

    2023-07-17 04:42:54
  • Android之在linux终端执行shell脚本直接打印当前运行app的日志的实现方法

    2021-06-12 23:41:08
  • IDEA不识别Java文件:文件变橙色&显示后缀名.java的解决

    2022-05-27 06:43:36
  • 详解JAVA 抽象类

    2022-12-15 19:29:20
  • Android 开发程序锁应用简单实例

    2021-10-07 07:41:34
  • 如何在Springboot实现拦截器功能

    2023-01-10 01:11:38
  • java中BigDecimal和0比较的示例代码

    2022-07-05 04:58:18
  • java实现Xml与json之间的相互转换操作示例

    2023-06-21 13:30:39
  • Android-Service实现手机壁纸自动更换

    2022-05-21 23:15:35
  • Http学习之组装报文

    2021-12-30 07:23:18
  • java数据结构实现机器人行走

    2023-12-04 00:44:24
  • 基于FeignException$InternalServerError的解决方案

    2023-04-25 15:50:45
  • JavaSwing BorderLayout 边界布局的实现代码

    2023-04-23 08:03:40
  • eclipse端口被占用问题的解决方法

    2022-10-04 07:01:54
  • c# 成员类型访问权限低于字段本身的实现

    2021-12-23 07:08:27
  • asp之家 软件编程 m.aspxhome.com