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