Optional是java8出现的特性,对函数式编程有着极好的帮助.Optional是一个包装类,是对普通类的包装,可以有效解决nullpointException

构造方法

  1. private Optional() {
  2. this.value = null;
  3. }
  4. public static<T> Optional<T> empty() {
  5. @SuppressWarnings("unchecked")
  6. Optional<T> t = (Optional<T>) EMPTY;
  7. return t;
  8. }
  9. private Optional(T value) {
  10. this.value = Objects.requireNonNull(value);
  11. }

所有的构造方法均被定义为private,阻止了通过构造创建Optional.因为Optional不支持序列化,所以不建议用来修饰类的成员变量.最好将Optional作为方法的返回值.

常用方法

静态方法构造

  • empty():Optional

    调用私有构造方法,返回一个空的Option

  1. public static<T> Optional<T> empty() {
  2. @SuppressWarnings("unchecked")
  3. Optional<T> t = (Optional<T>) EMPTY;
  4. return t;
  5. }
  • of(T):

    传一个非空的value,返回这个对象的Optional包装.如果value为空会报错

  1. public static <T> Optional<T> of(T value) {
  2. return new Optional<>(value);
  3. }
  • ofNullable(T)

    如果不确定value是否为空,使用该方法

  1. public static <T> Optional<T> ofNullable(T value) {
  2. return value == null ? empty() : of(value);
  3. }

常用方法

取值方式

  • get():T //如果Optional对象有值取值,为空会报错,配合isPresent()使用
  • isPresent():boolean
  • ifPresent(Consumer<? super T>):void //如果Optional对象有值执行Consumer生成的实例,无值不执行
  • orElse(T):T //如果Optional对象有值返回值,无值返回传入的形参对象
  • orElseGet(Supplier<? extends T>):T //若Optional对象有值返回值,无值返回调用Supplier生成的实例。

链式方法

  • filter(Predicate<? super T> predicate):Optional
  • map(Function<? super T, ? extends U> mapper):Optional
  • flatMap(Function<? super T, Optional> mapper): Optional
  1. 下列的例子将一个字符串类型的数字转化为数字,并输出.如果字符串为null,则不执行输出
  2. //用Optional包装一个字符串
  3. Optional<String> num = Optional.ofNullable("123");
  4. /*将num容器中的值解析为数字,并将结果用Optional包装.
  5. 如果numString为空,就调用empty()方法直接返回生成的空的Optional*/
  6. Optional<Integer> numInteger = numString.map(value -> Integer.parseInt(value));
  7. //如查numInteger不为空,就执行输出,如果为空,不执行
  8. numInteger.ifPresent(value-> System.out.println(value));
  9. //可以简写为:
  10. //函数式编程
  11. //String s="123";
  12. String s=null;
  13. Optional.ofNullable(s).map(Integer::parseInt).ifPresent(System.out::println);
  14. //上述代码可以分为三部分:入口,链式,出口

参考文档: https://blog.csdn.net/xiliunian/article/details/88738747