Optional类是 Java8 提供的一个新类。引入此类的目的是为了解决令人烦躁的 null 判断问题
    该类有点类似于包装类,将需要操作的Java类封装到该类的对象里面

    1. 构建API:构建一个Optional对象;方法有:empty()of()ofNullable()
    2. 获取API:获取Optional对象里包装的值;方法有:get()orElse()orElseGet()
      orElseThrow()
    3. 转换API:将Optional对象里包装的值转换成一个新的值;方法有:map()flatMap()
    4. 判断API:对Optional对象里包装的值做一些逻辑判断;方法有:filter()isPresent()
      ifPresent()

    假设我们现在有两个类—— Teacher类和Student类,Teacher类中有一个属性又是Student类的对象,我们现在需要获得老师属性中学生的姓名,不难发现这很容易就出现空指针异常。

    1. 可能是老师本身就是 null
    2. 可能是老师属性中的学生对象是null
    3. 可能是老师属性中的学生对象的姓名是null

    如果用常规判断 null 的方式来写看起来不是很优雅,我们不妨用Optional类来完成这个操作

    获得学生姓名的函数

    1. public String getStudentName(Teacher teacher){
    2. Optional<Teacher> optionalTeacher = Optional.ofNullable(teacher);
    3. if(optionalTeacher.isPresent()){
    4. Teacher t = optionalTeacher.get();
    5. Optional<Student> optionalStudent = Optional.ofNullable(t.getStudent());
    6. if(optionalStudent.isPresent()){
    7. Student student = optionalStudent.get();
    8. Optional<String> optionalName = Optional.ofNullable(student.getName());
    9. if(optionalName.isPresent()){
    10. return optionalName.get();
    11. }else{
    12. throw new RuntimeException("学生姓名未初始化");
    13. }
    14. }else{
    15. throw new RuntimeException("还没有给老师分配学生");
    16. }
    17. }else{
    18. throw new RuntimeException("老师信息不存在");
    19. }
    20. }

    测试

    1. 老师本身是null
      image.png
    2. 老师属性中的学生对象为null
      image.png
    3. 可能是老师属性中的学生对象的姓名是null
      image.png

    如果一切正常,那么输出如下,不会抛任何异常
    image.png