干掉null的Optional|8月更文挑战空指针

空指针

  • 我们在项目启动或者SQL查询中经常遇到NullPointerException
  • 请看如下代码

image.png

  • 我们经常会如下使用
person.getCar().getName();
复制代码
  • 假设一个人没有车,那么肯定会返回null

image.png

  • 在工程中我们常见的就是无脑的去套if层数来达到各种特判的情况
  • 这种做法是及其不具有扩展性和可读性,相比您也在工程代码中司空见惯

无脑套用if判空带来的问题

  1. 自身毫无意义
  2. 代码过于冗余,可读性差
  3. 极容易出错

引入Optional

  • java.util.Optional<T>中封装这Optional值的类
  • 比如我们提前预测可能会有人没有车,那么我们就将car放入到optional中形成Optional<Car>
  • 当对象为空时候使用的是Optional.empty()

image.png

  • 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

image.png

2.

  • 创建一个非空值使用Optional.of

image.png

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)
  • 那么我们可以改写为如下代码

image.png

  • 其中orElse表示如果Optional的结果值为空,设置奔驰的默认型号值是大G😄

结合filter使用

读取temp值

image.png

  • 这样实现可读性很差,并且由if去特判,如果我们又增加需求了
  • 要判断i的值如何如何,那么我们有需要使用if,这样就形成了恶性循环

使用Optional+filter(OptionalUtility由自己封装)

image.png

希望在工程中多一些Optional少一些if判空😘