Optional对象支持值可空的抽象,特别是针对Java中的NPE问题,Optional可以很好的显式的来应对。

比如:

user.getAddress().getProvince();

这种写法,在user为null时,是有可能报NullPointerException异常的。为了解决这个问题,于是采用下面的写法

if (user != null) {
	Address address = user.getAddress();
	if (address != null) {
		String province = address.getProvince();
	}
}

接下来介绍Optional的使用方法

静态构造方法

Optional(T value),
empty()
of(T value)
ofNullable(T value)

先说明一下,Optional(T value),即构造函数,它是private权限的,不能由外部调用的。其余三个函数是public权限,供我们所调用。

那么,Optional的本质,就是内部储存了一个真实的值,在构造的时候,就直接判断其值是否为空。

public final class Optional<T> {
    private static final Optional<?> EMPTY = new Optional<>();
    private Optional() {
        this.value = null;
    }
    
    private Optional(T value) {
        this.value = Objects.requireNonNull(value);
    }

    public static<T> Optional<T> empty() {
        @SuppressWarnings("unchecked")
        Optional<T> t = (Optional<T>) EMPTY;
        return t;
    }

    public static <T> Optional<T> of(T value) {
        return new Optional<>(value);
    }

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

当value值为null时,of(T value)会报NullPointerException异常;ofNullable(T value)不会throw Exception,ofNullable(T value)直接返回一个EMPTY对象。

是否存在判断

isPresent()
ifPresent(Consumer<? super T> consumer)

isPresent判断value值是否为空,而ifPresent就是在value值不为空时,做一些操作,比如:

Optional.ofNullable(user).ifPresent(u -> {
  // do something
});

orElse系列方法

orElse(T other)
orElseGet(Supplier<? extends T> other)
orElseThrow(Supplier<? extends X> exceptionSupplier)
    public T orElse(T other) {
        return value != null ? value : other;
    }

    public T orElseGet(Supplier<? extends T> other) {
        return value != null ? value : other.get();
    }

都是在构造函数传入的value值为null时,进行调用的。orElse和orElseGet的用法如下所示,相当于value值为null时,给予一个默认值

user = Optional.ofNullable(user).orElse(createUser());
user = Optional.ofNullable(user).orElseGet(() -> createUser());

通过源码可以看到,当user值不为null时,orElse函数依然会执行createUser()方法,而orElseGet函数并不会执行createUser()方法调用。

map和filter 函数处理

map(Function<? super T, ? extends U> mapper)
flatMap(Function<? super T, Optional<U>> mapper)
filter(Predicate<? super T> predicate)

增加了针对Optional对象的函数对象快捷操作方法