乐趣区

关于spring:Java9系列第7篇JavautilOptional优化与增强

我打算在后续的一段时间内,写一系列对于 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

欢送关注我的博客,外面有很多精品合集

本文转载注明出处(必须带连贯,不能只转文字):字母哥博客 – zimug.com

感觉对您有帮忙的话,帮我点赞、分享!您的反对是我不竭的创作能源!。另外,笔者最近一段时间输入了如下的精品内容,期待您的关注。

  • 《手摸手教你学 Spring Boot2.0》
  • 《Spring Security-JWT-OAuth2 一本通》
  • 《实战前后端拆散 RBAC 权限管理系统》
  • 《实战 SpringCloud 微服务从青铜到王者》
  • 《VUE 深入浅出系列》
退出移动版