空指针可以说是Java程序员遇到次数最多的异常了,只要判空判的不够彻底就有可能爆出惊喜(NullPointerException)。所有在程序中经常出现一大堆的if判空语句,导致代码看起来很复杂很臃肿。
Optional是Java 8 引进的一个新特性,专门用来解决判空问题。Optional可以理解为一个容器,这个容器中存储了要判空的对象。当我们需要进行操作时可以从这个容器取出要存储的对象。
Optional结构
从上图中可以看到Optional中有一个变量value,这个value就是存入Optional容器的对象。Optional中的方法操作的数据就是value。
创建Optional
Optional中有两个构造方法,但都是私有的。
从上面的结构图中可以看到,Optional中有三个静态方法of、ofNullable和empty的返回值是Optional<T>,可以通过这三个方法创建Optional
-
of;接收一个不为空的value参数 -
ofNullable;接收一个可能的value参数 -
empty:创建一个value为null的Optional示例:
Optional<String> stringOptional = Optional.of("string");
Optional<Object> objectOptional = Optional.ofNullable(null);
Optional<Object> empty = Optional.empty();
判空
Optional判断值是否存在的方式有两个isPresent和isEmpty
-
isPresent: 值存在是返回true -
isEmpty: 值为null时返回true
取值
从Optional中取值的方法有get、orElse、orElseGet、orElseThrow
-
get:值为null时会抛出异常 -
orElse:接收一个和value同类型的参数,当value为空时,返回这个参数 -
orElseGet:接收一个和value同类型的Supplier参数,当value为空时,Supplier提供的值 -
orElseThrow: 值为null时抛出异常orElseThrow有一个重载的方法,一个是抛出默认的异常,一个是抛出指定的异常 抛出默认异常
抛出指定异常,异常由Supplier提供
示例:
消费
ifPresent:接收一个Consumer (消费者)参数,当value不为空时执行消费操作
示例:
ifPresentOrElse:接收两个参数Consumer (消费者)和Runnable,当value不为空时执行Consumer消费操作, 当当value为空时执行Runnable操作
示例:
转换和过滤
Optional中转换方法有map和flatMap, 过滤方法有filter
map: 一对一转换转换值map方法接收一个Function类型的参数,Function定义了转换操作
示例:
flatMap:一对多转换值flatMap方法类似于map接收一个Function类型的参数, 区别在于flatMap接收的Function的返回值是Optional
示例:
-
stream:转换成streamstream方法是将Optional取出放入stream中 -
filter:判断value是否满足判断逻辑,如果满足返回原Optional,否则返回空的Optional
示例:
最后Optional虽好,但也不要滥用。