Optional类是 Java8 提供的一个新类。引入此类的目的是为了解决令人烦躁的 null 判断问题
该类有点类似于包装类,将需要操作的Java类封装到该类的对象里面
- 构建API:构建一个Optional对象;方法有:
empty()、of()、ofNullable() - 获取API:获取Optional对象里包装的值;方法有:
get()、orElse()、orElseGet()、orElseThrow() - 转换API:将Optional对象里包装的值转换成一个新的值;方法有:
map()、flatMap() - 判断API:对Optional对象里包装的值做一些逻辑判断;方法有:
filter()、isPresent()、ifPresent()
假设我们现在有两个类—— Teacher类和Student类,Teacher类中有一个属性又是Student类的对象,我们现在需要获得老师属性中学生的姓名,不难发现这很容易就出现空指针异常。
- 可能是老师本身就是
null - 可能是老师属性中的学生对象是
null - 可能是老师属性中的学生对象的姓名是
null
如果用常规判断 null 的方式来写看起来不是很优雅,我们不妨用Optional类来完成这个操作
获得学生姓名的函数
public String getStudentName(Teacher teacher){Optional<Teacher> optionalTeacher = Optional.ofNullable(teacher);if(optionalTeacher.isPresent()){Teacher t = optionalTeacher.get();Optional<Student> optionalStudent = Optional.ofNullable(t.getStudent());if(optionalStudent.isPresent()){Student student = optionalStudent.get();Optional<String> optionalName = Optional.ofNullable(student.getName());if(optionalName.isPresent()){return optionalName.get();}else{throw new RuntimeException("学生姓名未初始化");}}else{throw new RuntimeException("还没有给老师分配学生");}}else{throw new RuntimeException("老师信息不存在");}}
测试
- 老师本身是null

- 老师属性中的学生对象为null

- 可能是老师属性中的学生对象的姓名是
null
如果一切正常,那么输出如下,不会抛任何异常
