Java8 新特性-Optional类告别空指针

147 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第17天,点击查看活动详情

前言

Java8 中很多的新特性,空指针NPE异常是项目中很常见的问题,用if else 写判空操作代码的可读性很差,Java8中的Optional提供优雅的解决空指针的方案。

image.png

Optional类

Optional工具类, 可以看成一个容器,有两种情况1. 有值 2. 要么是null image.png

1. 创建Optional对象

// 1. 创建空的 Optional 实例
public static<T> Optional<T> empty() {
    @SuppressWarnings("unchecked")
    Optional<T> t = (Optional<T>) EMPTY;
    return t;
}

// 2. 创建 Optional实例
public static <T> Optional<T> of(T value) {
    return new Optional<>(value);
}

// 3. 有值返回 Optional实例,否则返回空的实例
public static <T> Optional<T> ofNullable(T value) {
    return value == null ? empty() : of(value);
}

常用的Method

1. ifPresent

判断是否包含值。包含值返回 true,不包含值返回 false

public class OptionalTest {

    public static void main(String[] args) {
        PayOrder payOrder = new PayOrder();
        System.out.println(Optional.ofNullable(payOrder.getOrderNo()).isPresent());
        payOrder.setOrderNo(12321312L);
        System.out.println(Optional.of(payOrder.getOrderNo()).isPresent());
    }
}

2. get()

如果Optional有值则将其返回,否则抛出 NoSuchElementException: No value present 异常

3.orElse()

如果调用对象包含值,返回该值,否则返回参数字符串str

4.orElseGet()

如果调用对象包含值,返回该值。否则返回 s 获取的值

 5.orElseThrows()

如果存在该值,返回包含的值,否则抛出由 Supplier 继承的异常

6.map()

如果有值对其处理,并返回处理后的Optional,否则返回 Optional.empty()

7.flatMap()

如果有值,为其执行 mapping 函数返回 Optional 类型返回值,否则返回空Optional。

8.filter()

filter()方法通过传入限定条件对 Optional 实例的值进行过滤。如果有值并且满足 Predicate判断条件,则返回包含该值的Optional,否则返回空 Optional。

9.ifPresent()

如果值存在则使用该值调用consumer,否则不做任何事情

10.ifPresentOrElse()

JDK9以后提供。如果值存在则使用该值调用consume,否则执行自定义的 Runnalbe 操作

11.equals()

判断其他对象是否等于Optional