Java 8 Optional | 8月更文挑战

358 阅读2分钟

空指针可以说是Java程序员遇到次数最多的异常了,只要判空判的不够彻底就有可能爆出惊喜(NullPointerException)。所有在程序中经常出现一大堆的if判空语句,导致代码看起来很复杂很臃肿。 Optional是Java 8 引进的一个新特性,专门用来解决判空问题。Optional可以理解为一个容器,这个容器中存储了要判空的对象。当我们需要进行操作时可以从这个容器取出要存储的对象。

Optional结构

image.png

从上图中可以看到Optional中有一个变量value,这个value就是存入Optional容器的对象。Optional中的方法操作的数据就是value。

创建Optional

Optional中有两个构造方法,但都是私有的。

image.png

image.png

从上面的结构图中可以看到,Optional中有三个静态方法ofofNullableempty的返回值是Optional<T>,可以通过这三个方法创建Optional

  • of;接收一个不为空的value参数 of

  • ofNullable;接收一个可能的value参数 image.png

  • empty:创建一个value为null的Optional 示例:

Optional<String> stringOptional = Optional.of("string");
Optional<Object> objectOptional = Optional.ofNullable(null);
Optional<Object> empty = Optional.empty();

判空

Optional判断值是否存在的方式有两个isPresentisEmpty

  • isPresent: 值存在是返回true image.png

  • isEmpty: 值为null时返回true image.png

取值

Optional中取值的方法有getorElseorElseGetorElseThrow

  • get:值为null时会抛出异常 image.png

  • orElse:接收一个和value同类型的参数,当value为空时,返回这个参数 image.png

  • orElseGet:接收一个和value同类型的Supplier参数,当value为空时,Supplier提供的值 image.png

  • orElseThrow: 值为null时抛出异常 orElseThrow有一个重载的方法,一个是抛出默认的异常,一个是抛出指定的异常 抛出默认异常 image.png

抛出指定异常,异常由Supplier提供 image.png

示例: image.png

消费

  • ifPresent:接收一个Consumer (消费者)参数,当value不为空时执行消费操作
    image.png

示例: image.png

  • ifPresentOrElse:接收两个参数Consumer (消费者)Runnable,当value不为空时执行Consumer消费操作, 当当value为空时执行Runnable操作 image.png

示例: image.png

转换和过滤

Optional中转换方法有mapflatMap, 过滤方法有filter

  • map: 一对一转换转换值 map方法接收一个Function类型的参数,Function定义了转换操作 image.png

示例: image.png

  • flatMap:一对多转换值 flatMap方法类似于map接收一个Function类型的参数, 区别在于flatMap接收的Function的返回值是Optional image.png

示例: image.png

  • stream:转换成stream stream方法是将Optional取出放入streamimage.png

  • filter:判断value是否满足判断逻辑,如果满足返回原Optional,否则返回空的Optional image.png

示例: image.png

最后Optional虽好,但也不要滥用。