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();
}
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
if (value != null) {
return value;
} else {
throw exceptionSupplier.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对象的函数对象快捷操作方法