天天看点

java8新特性从入门到应用 第四章 空指针的终结者 java.util.Optional<T>

引言

如果问 java coder 编程中见到最多的异常是什么 百分之九十九的程序猿会回答空指针:

java.lang.NullPointerException

根据异常排行榜信息 详细请点击

而空指针异常出现频次竟高出第二名两倍,由此可以断言 只有程序解决了空指针异常那么程序异常崩溃的概率将减少一半。

java8 在工具栏上给我们提供个利器

java.util.Optional<T>

java.util.Optional

其实 java.util.Optional 解决空指针并没有什么神奇之处,只是普通封装的一个工具类 ,并让工具类支持了一下lambda 表达式 将外部判空的操作移动到内部去了

ifPresent

方法进行举例 源码如下:

/**
     * If a value is present, invoke the specified consumer with the value,
     * otherwise do nothing.
     *
     * @param consumer block to be executed if a value is present
     * @throws NullPointerException if value is present and {@code consumer} is
     * null
     */
    public void ifPresent(Consumer<? super T> consumer) {
        if (value != null)
            consumer.accept(value);
    }
           

其实这与我们自己封装的工具类并无二至,下面介绍一下使用

创建

Optional<T>

类将构造函数进行了私有化 故只能通过3个静态方法创建实例

  1. Optional.empty()

    此方法将创建一个空的

    Optional<T>

  2. Optional.of(value)

    此方法将创建一个泛型为

    value

    Optional<T>

    其中

    value

    为不可 为

    null

    的如果为

    null

    则会抛出 空指针异常
  3. Optional.ofNullable(value)

    当不确定

    value

    是否为

    null

    时调用 不会抛出异常

api使用简介

由于返回值在java之后的版本并不兼容 所以这里就不贴返回值了,可以自己进行调用后点进去看返回值,这个类整体都很易懂一看就清楚了

方法 参数 作用
get 获取被包装的对象 如果对象为

null

则抛出

new NoSuchElementException("No value present")

异常
isPresent 根据返回 boolean 类型判断是否为

null

ifPresent Consumer<? super T> 如果参数不为

null

则执行传入的方法
filter Predicate<? super T> 如果传入的方法返回

false

则返回空的

Optional<T>

否则返回自身
map Function<? super T, ? extends U> 根据传入的方法将当前值转换成其他值并用

Optional<T>

进行包装
flatMap Function<? super T, Optional>

map

仅仅是传入方法的返回值不同
orElse T 传入一个与其泛型相同的参数,如果

Optional<T>

内包装对象为

null

则返回传入对象 否则返回被包装对象
orElseGet Supplier<? extends T> 含义与

orElse

相同 不同支出在于

orElse

传入的是创建好的对象 而此时传入创建过程
orElseThrow Supplier<? extends X> exceptionSupplier 传入构建一个异常方法,如果被包装对象为

null

则抛出此异常

继承的方法

Optional<T>

继承重新了

equals

hashCode

使其直接调用被包装者本身的

equals

hashCode

进行比较操作,重写了

toString

方法在其输出外包装了一次

Optional[%s]

的形式