Java8的Optional:如何干掉空指针?

Optional概述

Optional 是个容器:它能够保存类型T的value,或者仅仅保存null。Optional提供不少有用的方法,这样咱们就不用显式进行空值检测,很好地解决了空指针异常处理的问题,好比可使用isPresent()方法判断value是否为null,使用get()方法获取value值等等。html

Optional的构造方法是私有的,实例不能new,可使用静态方法来建立:java

// 一、建立一个包装对象值为空的Optional对象
Optional<String> optStr = Optional.empty();
// 二、建立包装对象值非空的Optional对象
Optional<String> optStr1 = Optional.of("optional");
// 三、建立包装对象值容许为空的Optional对象
Optional<String> optStr2 = Optional.ofNullable(null);

Optional简单案例

看完Optional的概述,咱们用一个简单的例子说明一下:git

下面这段代码接收一个User对象,若是user为null,则抛出异常【这是一个很是常规的避免空指针异常的作法,若是没有这步,getName会NPE】,不然返回user的name。github

public String getName1(User user) {
        if (user == null) {
            throw new RuntimeException("user不能为null!");
        }
        return user.getName();
    }

若是使用Optional,应该怎么去处理呢?app

public String getName2(User user) {
        return Optional.ofNullable(user) // 包装user对象,若是user为null,则返回空的Optional对象
                .map(User::getName)
                .orElseThrow(() -> new RuntimeException("user不能为null"));// 若是有值则返回,没有则抛出异常。
    }
  • Optional使用静态的ofNullable方法将user对象进行包装,将可能为null的user对象保护起来。
public static <T> Optional<T> ofNullable(T value) {
        // empty() 方法 建立一个空的Optional对象, of对象在构造Optional的时候,value若是weinull,会引起NPE
        return value == null ? empty() : of(value);
    }
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
        // 若是有值,直接返回值
        if (value != null) {
            return value;
        } else {
            // 抛出异常,这个异常Supplier接口定义
            throw exceptionSupplier.get();
        }
    }

Optional的主要方法

方法 描述
empty 返回一个空的 Optional 实例
filter 若是值存在而且知足提供的断言, 就返回包含该值的 Optional 对象;不然返回一个空的 Optional 对象
map 若是值存在,就对该值执行提供的 mapping 函数调用
flatMap 若是值存在,就对该值执行提供的 mapping 函数调用,返回一个 Optional 类型的值,不然就返 回一个空的 Optional 对象
get 若是该值存在,将该值用 Optional 封装返回,不然抛出一个 NoSuchElementException 异常
ifPresent 若是值存在,就执行使用该值的方法调用,不然什么也不作
isPresent 若是值存在就返回 true,不然返回 false
of 将指定值用 Optional 封装以后返回,若是该值为 null,则抛出一个 NullPointerException 异常
ofNullable 将指定值用 Optional 封装以后返回,若是该值为 null,则返回一个空的 Optional 对象
orElse 若是有值则将其返回,不然返回一个默认值
orElseGet 若是有值则将其返回,不然返回一个由指定的 Supplier 接口生成的值
orElseThrow 若是有值则将其返回,不然抛出一个由指定的 Supplier 接口生成的异常

参考阅读

相关文章
相关标签/搜索