Lambda从入门到精通之二十三 深入理解Optional的作用

Optional的作用是什么?
主要作用是消除空指针,但是消除空指针并非是直接用上Optonal,而你什么也不用做了,还是需要做判断。
你可能会问,既然还是要做判断做处理,那跟我用if判断某个对象!=null有什么区别?
这是一个非常好的问题,我们往下看,就知道Optional消除空指针的目的了。

我们先来看不使用Optonal的例子,代码直接报空指针了NullPointerException,看代码:

@Data
public class OptPerson {

    private String name;

    private OptCar optCar;
}


@Data
public class OptCar {

    private String carName;

    private OptCarBrand optCarBrand;
}


@Data
public class OptCarBrand {

    private String brandName;
}


/**
 * Optional
 * @author www.itzhimei.com
 */
public class OptTest {

    public static void main(String[] args) {
        OptPerson optPerson = new OptPerson();
        optPerson.setName("IT之美");

        System.out.println(optPerson);
        System.out.println(optPerson.getOptCar().getOptCarBrand());
    }
}

/*
OptPerson(name=IT之美, optCar=null)
Exception in thread "main" java.lang.NullPointerException
	at com.itzhimei.base.lambda.option.OptTest.main(OptTest.java:14)
 */

我们在main函数里,当然可以使用if(optPerson.getOptCar() != null)来判断OptCar是否为空,然后再来进行后续操作,这样就能避免空指针,这是我们以往的操作方法。

我们再来看看使用了Optional包装上我们的目标类型的例子,看代码:

import java.util.Optional;

@Data
public class OptPerson {

    private String name;

    private Optional<OptCar> optCar;
	
}


@Data
public class OptCar {

    private String carName;

    private OptCarBrand optCarBrand;
}


@Data
public class OptCarBrand {

    private String brandName;
}


import java.util.Optional;

/**
 * Optional
 * @author www.itzhimei.com
 */
public class OptTest {

    public static void main(String[] args) {
        OptPerson optPerson = new OptPerson();
        optPerson.setName("IT之美");
        optPerson.setOptCar(Optional.empty());

        System.out.println(optPerson);
        System.out.println(optPerson.getOptCar().get().getOptCarBrand());
    }
}

/*
OptPerson(name=IT之美, optCar=Optional.empty)
Exception in thread "main" java.util.NoSuchElementException: No value present
	at java.util.Optional.get(Optional.java:135)
	at com.itzhimei.base.lambda.option.OptTest.main(OptTest.java:17)
 */

我们看到使用Optional包装的属性,如果是空的,直接调用还是会报错,虽然不是空指针,但其实也没什么区别,那么Optional的作用是什么呢?
从上一篇文章已经了解了Optional提供了几种方法来避免空指针,从而化解空对象报错的问题,但是Optional最核心的目的并不是消除空指针,而是在业务代码上区分一个Bean中的属性,哪些是可以为空的,哪些是不能为空的。
也就是说Optional的一个作用就是能够帮我们区分出,哪些属性是可以为空的,哪些是必须有值的。
例如上面的例子,声明了Optoinal包装类型的属性,说明是可以为空的,例如人的汽车,一个人可能有车,也可能没有,人名是必须有的,所以name属性声明为String类型,而不是Optoinal的包装类,而人的car属性,声明为Optional类型。