课程表

Java 基础教程

Java 面向对象

Java 高级教程

工具箱
速查手册

Java 9 改进的 Optional 类

当前位置:免费教程 » Java相关 » Java

Optional 类在 Java 8 中引入,Optional 类的引入很好的解决空指针异常。。在 java 9 中, 添加了三个方法来改进它的功能:

  • stream()

  • ifPresentOrElse()

  • or()


stream() 方法

语法

  1. public Stream<T> stream()

stream 方法的作用就是将 Optional 转为一个 Stream,如果该 Optional 中包含值,那么就返回包含这个值的 Stream,否则返回一个空的 Stream(Stream.empty())。

  1. import java.util.Arrays;
  2. import java.util.List;
  3. import java.util.Optional;
  4. import java.util.stream.Collectors;
  5. import java.util.stream.Stream;
  6.  
  7. public class Tester {
  8. public static void main(String[] args) {
  9.    List<Optional<String>> list = Arrays.asList (
  10.       Optional.empty(), 
  11.       Optional.of("A"), 
  12.       Optional.empty(), 
  13.       Optional.of("B"));
  14.  
  15.       //filter the list based to print non-empty values
  16.   
  17.       //if optional is non-empty, get the value in stream, otherwise return empty
  18.       List<String> filteredList = list.stream()
  19.          .flatMap(-> o.isPresent() ? Stream.of(o.get()) : Stream.empty())
  20.          .collect(Collectors.toList());
  21.  
  22.       //Optional::stream method will return a stream of either one 
  23.       //or zero element if data is present or not.
  24.       List<String> filteredListJava9 = list.stream()
  25.          .flatMap(Optional::stream)
  26.          .collect(Collectors.toList());
  27.  
  28.       System.out.println(filteredList);
  29.       System.out.println(filteredListJava9);
  30.    }  
  31. }

执行输出结果为:

  1. [A, B]
  2. [A, B]


ifPresentOrElse() 方法

语法

  1. public void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction)

ifPresentOrElse 方法的改进就是有了 else,接受两个参数 Consumer 和 Runnable。

ifPresentOrElse 方法的用途是,如果一个 Optional 包含值,则对其包含的值调用函数 action,即 action.accept(value),这与 ifPresent 一致;与 ifPresent 方法的区别在于,ifPresentOrElse 还有第二个参数 emptyAction —— 如果 Optional 不包含值,那么 ifPresentOrElse 便会调用 emptyAction,即 emptyAction.run()。

  1. import java.util.Optional;
  2.  
  3. public class Tester {
  4.    public static void main(String[] args) {
  5.       Optional<Integer> optional = Optional.of(1);
  6.  
  7.       optional.ifPresentOrElse( x -> System.out.println("Value: " + x),() -> 
  8.          System.out.println("Not Present."));
  9.  
  10.       optional = Optional.empty();
  11.  
  12.       optional.ifPresentOrElse( x -> System.out.println("Value: " + x),() -> 
  13.          System.out.println("Not Present."));
  14.    }  
  15. }

执行输出结果为:

  1. Value: 1
  2. Not Present.


or() 方法

语法

  1. public Optional<T> or(Supplier<? extends Optional<? extends T>> supplier)

如果值存在,返回 Optional 指定的值,否则返回一个预设的值。

  1. import java.util.Optional;
  2. import java.util.function.Supplier;
  3.  
  4. public class Tester {
  5.    public static void main(String[] args) {
  6.       Optional<String> optional1 = Optional.of("Mahesh");
  7.       Supplier<Optional<String>> supplierString = () -> Optional.of("Not Present");
  8.       optional1 = optional1.or( supplierString);
  9.       optional1.ifPresent( x -> System.out.println("Value: " + x));
  10.       optional1 = Optional.empty();    
  11.       optional1 = optional1.or( supplierString);
  12.       optional1.ifPresent( x -> System.out.println("Value: " + x));  
  13.    }  
  14. }

执行输出结果为:

  1. Value: Mahesh
  2. Value: Not Present


转载本站内容时,请务必注明来自W3xue,违者必究。
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号