为什么jdk8中加入了Optional
使用过java判断NPE(空指针异常)问题的小伙伴,一定知道判空的代码写起来一点都不优雅并且会出现运行时期经常会出现NPE。Optional自带判空函数,是代码更加整洁和优雅。
构造方法
源码
- static Optional empty()
描述:返回空的 Optional 实例
使用场景:内部value是null。
public static<T> Optional<T> empty() {
@SuppressWarnings("unchecked")
Optional<T> t = (Optional<T>) EMPTY;
return t;
}
- static Optional of(T value)
描述:返回一个指定非null值的Optional。
使用场景:明确知道入参value不为空,或者允许运行时抛出NPE异常。
public static <T> Optional<T> of(T value) {
return new Optional<>(value);
}
- static Optional ofNullable(T value)
描述:如果为非空,返回 Optional描述的指定值,否则返回空的 Optional。
使用场景:value==null 就得到 Optional.empty(), 非 null 就调用 Optional.of(value)。
public static <T> Optional<T> ofNullable(T value) {
return value == null ? empty() : of(value);
}
常用方法
不为空则返回对象
- T orElse(T other) 如果存在该值,返回值, 否则返回 other。
- T orElseGet(Supplier<? extends T> other) 如果存在该值,返回值, 否则触发 other,并返回 other 调用的结果。
- T orElseThrow(Supplier<? extends X> exceptionSupplier) 如果存在该值,返回包含的值,否则抛出由 Supplier 继承的异常。
不为空则执行动作
- void ifPresent(Consumer<? super T> consumer) 如果值存在则使用该值调用 consumer ,否则不做任何事情。
- Optional map(Function<? super T,? extends U> mapper)
如果有值,则对其执行调用映射函数得到返回值。如果返回值不为 null,则创建包含映射返回值的Optional作为map方法返回值,否则返回空Optional。 - Optional flatMap(Function<? super T,Optional> mapper)
如果值存在,返回基于Optional包含的映射方法的值,否则返回一个空的Optional(
区别于Map,返回类型是Optional)
不为空则过滤
- Optional filter(Predicate<? super predicate) 如果值存在,并且这个值匹配给定的
predicate,返回一个Optional用以描述这个值,否则返回一个空的Optional。
总结
Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。和lamdba表达式,新加入的supplier等接口一起使用,代码优雅简洁。