我们在日常的开发工作最经常碰到的异常就是空指针异常,排查起来非常麻烦影响开发效率。如果想避免这种问题,就要写大量的if(xx != null){}这样的冗余代码,把自己的逻辑写入到括号内部,这样的代码看起来臃肿繁琐。
JDK8中为我们提供了Optional对象很好的帮助了我们解决了这个问题。
什么是Optional对象?
可以把Optional对象当做一个一元容器,也就是说一个Optional只能存储一个对象。表示一个可能为空对象。
Optional错误的错误用法
Person person = initPerson();
if(person != null){
// 代码处理逻辑
}
Optional<Person> personOptional = Optional.ofNullable(person);
if(personOptional.isPresent()){
// 代码处理逻辑
}
这样的方式与编写if(xx!=null)无异而且还多了一步把对象放入Optional的步骤。
1.对象放入Optional的方式。
Optional<Person> personOptional = Optional.ofNullable(person);
Optional<Person> personOptional1 = Optional.of(person);
ofNullable方法与of方法有什么区别呢?两者都可以传入对象创建Optional实体,区别在于前者可以传入null,后者不可以传入null,否则就会抛出异常,向这样。
2.Optional的链式操作
String personName = personOptional.map(Person::getName).orElse("暂无");
System.out.println(personName);
System.out.println();
Optional<Person> personSalaryOptional = personOptional.filter(p -> p.getSalary() > 1000);
personOptional.filter(p -> p.getSalary() > 1000).ifPresent(a->{
});
3.Optional的短路操作
personOptional.map(Person::getPets).orElse(initPet());
personOptional.map(Person::getPets).orElseGet(()-> initPet());
orElse()如果不会造成短路,如果括号里是一个函数,orElse会直接调用该函数初始化变量。
orElseGet()会造成短路只有在对象为空的时候才会去调用,括号里的函数。
4.Optional抛出异常
personOptional.orElseThrow(()->new RuntimeException());