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的概述,咱们用一个简单的例子说明一下: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"));// 若是有值则返回,没有则抛出异常。 }
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(); } }
方法 | 描述 |
---|---|
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 接口生成的异常 |