空指针
- 我们在项目启动或者SQL查询中经常遇到NullPointerException
- 请看如下代码
- 我们经常会如下使用
person.getCar().getName();
复制代码
- 假设一个人没有车,那么肯定会返回null
- 在工程中我们常见的就是无脑的去套if层数来达到各种特判的情况
- 这种做法是及其不具有扩展性和可读性,相比您也在工程代码中司空见惯
无脑套用if判空带来的问题
- 自身毫无意义
- 代码过于冗余,可读性差
- 极容易出错
引入Optional
- 在
java.util.Optional<T>
中封装这Optional值的类 - 比如我们提前预测可能会有人没有车,那么我们就将car放入到optional中形成
Optional<Car>
- 当对象为空时候使用的是
Optional.empty()
empty()
方法是一个静态工厂,返回的是Optional类的特定单一示例
private static final Optional<?> EMPTY = new Optional<>();
复制代码
-它与null引用最大的区别就是,Optional不会触发NullPointerException
使用Optional改写
class Person {
private Optional<Car> car;
public Optional<Car> getCar() {
return car;
}
}
复制代码
几种创建方式
1.
- 声明一个空的Optional
2.
- 创建一个非空值使用Optional.of
3.
- 使用静态工厂方法Optional.ofNullable来创建一个可以为null的Optional,来看源码
public static <T> Optional<T> ofNullable(T value) {
return value == null ? empty() : of(value);
}
复制代码
- 使用:
Optional<Benz> optCar = Optional.ofNullable(Benz);
复制代码
在stream中使用Optional
- 假设一个人有车,车是奔驰,去获取奔驰的型号(name)
- 那么我们可以改写为如下代码
- 其中
orElse
表示如果Optional的结果值为空,设置奔驰的默认型号值是大G😄
结合filter使用
读取temp值
- 这样实现可读性很差,并且由if去特判,如果我们又增加需求了
- 要判断i的值如何如何,那么我们有需要使用if,这样就形成了恶性循环
使用Optional+filter(OptionalUtility由自己封装)
希望在工程中多一些Optional少一些if判空😘
近期评论