java.util.Optional 详解
java.util.Optional 详解
java.util.Optional
说起空异常 NullPointerException 这注定又是一个一说就明白,一讲就糊涂,一讨论就翻天的问题。所以我早就想整理这篇文章了。
Optional 类
Optional 类是一个可以为 null 的容器对象。它是个容器,所以它可以保存类型T的值,或者仅仅保存 null。Optional 的诞生,可以让我们不用显式进行空值检测。
Optional 是 Java 实现函数式编程的强劲一步,并且帮助在范式中实现。但是 Optional 的意义显然不止于此。
public final class Optional<T> {}
Optional 的方法
Java 8 中 Optional 类的主要方法大概有 15 个,在 java 9 中,又引入了 3 个新方法。java 8 中的方法,具体如下:
| 序号 | 方法 & 描述 |
|---|---|
| 1 | static |
| 2 | boolean equals(Object obj)判断其他对象是否等于 Optional。 |
| 3 | Optional |
| 4 | Optional flatMap(Function<? super T,Optional> mapper)如果值存在,返回基于Optional包含的映射方法的值,否则返回一个空的Optional |
| 5 | T get()如果在这个Optional中包含这个值,返回值,否则抛出异常:NoSuchElementException |
| 6 | int hashCode()返回存在值的哈希码,如果值不存在 返回 0。 |
| 7 | void ifPresent(Consumer<? super T> consumer)如果值存在则使用该值调用 consumer , 否则不做任何事情。 |
| 8 | boolean isPresent()如果值存在则方法会返回true,否则返回 false。 |
| 9 | Optional map(Function<? super T,? extends U> mapper)如果存在该值,提供的映射方法,如果返回非null,返回一个Optional描述结果。 |
| 10 | static |
| 11 | static |
| 12 | T orElse(T other)如果存在该值,返回值, 否则返回 other。 |
| 13 | T orElseGet(Supplier<? extends T> other)如果存在该值,返回值, 否则触发 other,并返回 other 调用的结果。 |
| 14 | |
| 15 | String toString()返回一个Optional的非空字符串,用来调试 |
在以前,我们判断一个非空的值,层级多的多,代码就非常的沉余,难以维护。如下:
if(null != xttblog){
if(null != xttblog.getName()){
System.out.println("业余草");
}
}
如果我们使用 Optional 类,就可以用下面的方法来进行:
Optional.of(xttblog).map(Xttblog::getName).ifPresent(System.out::println);
Optional 类用到了工厂方法的设计模式,比如 Optional.of(null) 和 Optional.ofNullable(null)。
更多的用法建议大家多去实践!