携手创作,共同成长!这是我参与「掘金日新计划 · 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类