一、关于

Java 8 在java.util包中添加了一个新的类OptionalOptional类是一个容器,用于表示可能包含也可能不包含非 null 值,可以用来帮助我们避免空指针的问题。

二、java.util.Optional 类

2.1 创建

Optional 类提供了三个静态方法用于创建 Optional 类的实例

方法 说明
empty() 创建一个空 ( empty ) 的 Optional 类的实例
of(T value) 创建一个包含了指定 T 类型的 value 值的 Optional 实例
ofNullable(T value) 如果 value 非 null ,则创建一个包含了指定 T 类型的 value 值的 Optional 实例,否则创建一个空的 Optional 实例

2.2 Optional 类提供的方法

方法 说明
boolean equals(Object obj) 判断某个其它的对象是否 「 等于 」 此 Optional
Optional filter(Predicate<? super T> predicate) 如果存在值,并且值与给定谓词匹配,则返回描述值的 Optional,否则返回空 Optional
Optional flatMap(Function<? super T, Optional> mapper) 如果值存在,则将 map 应用到该值上并返回应用后的结果,如果值不存在,则返回一个空的 Optional
T get() 如果此 Optional 中存在值,则返回该值,否则抛出NoSuchElementException 异常
int hashCode() 如果值存在,则返回当前值的哈希值,如果不存在值,则返回 0
void ifPresent(Consumer<? super T> consumer) 如果值存在,则使用该值作为参数调用方法 consumer 。如果值不存在,则什么事情都不做
boolean isPresent() 如果值存在则返回 true ,否则返回 false
Optional map(Function<? super T,? extends U> mapper) 如果存在值,则将传递的 map 函数应用于该值,如果结果为非 null,则返回描述结果的 Optionals
T orElse(T other) 如果值存在则返回值,否则返回 other
T orElseGet(Supplier<? extends T> other) 如果值存在则返回值,否则调用 other 并返回该调用的结果
T orElseThrow(Supplier<? extends X>>exceptionSupplier) 如果值存在,则返回包含的值,否则抛出由开发者提供的异常
String toString() 返回此 Optional 的非空字符串表示形式,一般用于调试

三、使用

    // Optional 构造方式1 - of 传入的值不能为 null
    Optional<String> helloOption = Optional.of("hello");
    // Optional 构造方式2 - empty 一个空 optional
    Optional<String> emptyOptional = Optional.empty();
    // Optional 构造方式3 - ofNullable 支持传入 null 值的 optional
    Optional<String> nullOptional = Optional.ofNullable(null);
    
    Optional<String> stringOptional = Optional.of("hello");
    // 判断是否不为null
    System.out.println(stringOptional.isPresent());
    
    // 获取值
    // 1、get 直接获取值,为空时抛出NoSuchElementException异常
    System.out.println(stringOptional.get());
    // 2、orElse 为空时获取到默认值
    stringOptional.orElse("default");
    // 3、orElseGet 为空时获取到默认值,与orElse相比,Supplier方法只有在Optional对象不含值时才执行调用
    stringOptional.orElseGet(() -> "default");
    // 4、orElseThrow 为空时抛出自定义异常
    stringOptional.orElseThrow(() -> new NullPointerException("值为空"));
    
    
    // ifPresent 存在值时调用方法,不存在时do nothing
    stringOptional.ifPresent(System.out::println);
    // filter 过滤值
    stringOptional.filter(str -> str.length() > 3).ifPresent(System.out::println);
    // map 转换值,返回值与当前值类型相同
    stringOptional.map(str -> str + "123");
    // flatMap 转换值,返回值可以与传入值不同,且返回值需要手动包装为Optional类型
    stringOptional.flatMap(str -> Optional.of(str.length())).ifPresent(System.out::println);