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
如果一切正常,那么输出如下,不会抛任何异常