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