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

引言

如果问 java coder 编程中见到最多的异常是什么 百分之九十九的程序猿会回答空指针:java.lang.NullPointerException
根据异常排行榜信息 详细请点击
而空指针异常出现频次竟高出第二名两倍,由此可以断言 只有程序解决了空指针异常那么程序异常崩溃的概率将减少一半。
java8 在工具栏上给我们提供个利器 java.util.Optional

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 类将构造函数进行了私有化 故只能通过3个静态方法创建实例

  1. Optional.empty() 此方法将创建一个空的 Optional
  2. Optional.of(value) 此方法将创建一个泛型为 valueOptional 其中value为不可 为null 的如果为null则会抛出 空指针异常
  3. Optional.ofNullable(value) 当不确定 value 是否为 null 时调用 不会抛出异常

api使用简介

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

方法 参数 作用
get 获取被包装的对象 如果对象为 null 则抛出 new NoSuchElementException("No value present")异常
isPresent 根据返回 boolean 类型判断是否为null
ifPresent Consumer 如果参数不为null则执行传入的方法
filter Predicate 如果传入的方法返回false则返回空的Optional否则返回自身
map Function 根据传入的方法将当前值转换成其他值并用Optional进行包装
flatMap Function> map 仅仅是传入方法的返回值不同
orElse T 传入一个与其泛型相同的参数,如果Optional内包装对象为null则返回传入对象 否则返回被包装对象
orElseGet Supplier 含义与orElse相同 不同支出在于orElse传入的是创建好的对象 而此时传入创建过程
orElseThrow Supplier exceptionSupplier 传入构建一个异常方法,如果被包装对象为null 则抛出此异常

继承的方法

Optional 继承重新了 equalshashCode 使其直接调用被包装者本身的 equalshashCode 进行比较操作,重写了 toString 方法在其输出外包装了一次 Optional[%s] 的形式

你可能感兴趣的:(Java8新特性,java8新特性从入门到应用)