JDK设计时,错误的引入了null这个常量,使得空指针异常泛滥(java制服自己说的)。为兼容以前的jdk版本,该问题暂时不好解决,jdk8提供了一个optional容器来封装容器,尽可能的解决空指针异常问题。

    Optional 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在, 原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。并且 可以避免空指针异常。

    Optional其本质是代替了一部分if-else判断语句,从而简化了代码 。

    提供的方法如下
    image.png
    常用方法:

    • Optional.of(T t) : 创建一个 Optional 实例
    • Optional.empty() : 创建一个空的 Optional 实例
    • Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则创建空实例
    • isPresent() : 判断是否包含值
    • orElse(T t) : 如果调用对象包含值,返回该值,否则返回t
    • orElseGet(Supplier s) :如果调用对象包含值,返回该值,否则返回 s 获取的值
    • map(Function f): 如果有值对其处理,并返回处理后的Optional,否则返回 Optional.empty()
    • flatMap(Function mapper):与 map 类似,要求返回值必须是Optional | static Optional empty()返回空的 Optional 实例。 | | —- | | boolean equals(Object obj)判断其他对象是否等于 Optional。 | | Optional filter(Predicate<? super predicate)如果值存在,并且这个值匹配给定的 predicate,返回一个Optional用以描述这个值,否则返回一个空的Optional。 | | Optional flatMap(Function<? super T,Optional> mapper)如果值存在,返回基于Optional包含的映射方法的值,否则返回一个空的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)如果有值,则对其执行调用映射函数得到返回值。如果返回值不为 null,则创建包含映射返回值的Optional作为map方法返回值,否则返回空Optional。 | | static Optional of(T value)返回一个指定非null值的Optional。 | | static Optional ofNullable(T value)如果为非空,返回 Optional 描述的指定值,否则返回空的 Optional。 | | T orElse(T other)如果存在该值,返回值, 否则返回 other。 | | T orElseGet(Supplier<? extends T> other)如果存在该值,返回值, 否则触发 other,并返回 other 调用的结果。 | | T orElseThrow(Supplier<? extends X> exceptionSupplier)如果存在该值,返回包含的值,否则抛出由 Supplier 继承的异常 | | String toString()返回一个Optional的非空字符串,用来调试 |

    然而,并没有什么卵用,该功能还很鸡肋,空指针问题还得从语法上解决,对比JVM上的其他语音就处理的非常好。举个例子kotlin语言:

    • 假设一个变量 user用户
    • user?.getName() ,name为空时返回null,不为空时返回name。用?放到变量后即可
    • user!.getName() , name为空时抛出异常,不为空时返回name。用!放到变量后即可