三分钟,学会使用Java8新特性Optional类

81 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天,点击查看活动详情

Optional类

Optional是一个容器类,提供很多方法来让我们不必显式的去判空,比如使用很多的(if xxx == null),对付空指针异常有不错的效果

使用方法

创建Optional类对象的方法:

Optional.of(T t) : 创建一个 Optional 实例,t 为需要保存的数据,不能为空

Optional.empty() : 创建一个空的 Optional 实例

Optional.ofNullable(T t):t 可以为 null

判断Optional容器是否包含对象

boolean isPresent():判断是否包含对象

void ifPresent(Consumer<? super T> consumer):如果有值,就执行 Consumer 接口的实现代码,并且该值会作为参数传给它

获取 Optional 容器的对象

T get():如果调用对象包含值,返回该值,否则抛异常

T orElse(T other):如果有值则将其返回,否则返回指定的 other 对象

T orElseGet(Supplier<? extends t> other):如果有值则将其返回,否则返回由 Supplier 接口实现提供的对象。

T orElseThrow(Supplier<? extends X> exceptionSupplier):如果有值则将其返回,否则抛出由 Supplier 接口实现提供的异常

使用场景

比如有一个查询员工的接口

@GetMapping("/employee/{id}")
public Employee employee(@PathVariable("id") String id){
    Optional<Employee> employee = Optional.ofNullable(employeeService.getById(id));
    return employee.orElseThrow(()->new QueryException("查询失败"));
}

在这将服务层查询到的职工对象放入Optional类中,直接返回orElseThrow(),若employee不为空则返回,为空则代表查询失败则抛错,自行捕获即可

如果不用Optional,代码如下:

@GetMapping("/employee/{id}")
public Employee employee(@PathVariable("id") String id) {
    Employee employee = employeeService.getById(id);
    if (employee == null) {
        throw new QueryException("查询失败");
    }
    return employee;
}

若再增加一个查询失败自动注册用户再返回呢?Optinal只需要返回orElseGet()此方法即可

Optional的源码加上注释也只有350行,没有复杂的逻辑,大家可以尝试阅读一下,特别是函数式接口不太熟的同学,可以试着手写一个Optional类