Optional类
一、引入
- 空指针异常是导致Java应用程序失败的最常见原因,为了解决空指针异常,Google公司在著名的Guava项目中引入Optional类,通过检查空值的方式来防止代码污染,鼓励程序员写更干净的代码。
- Optional类(java.util.Optional)是一个容器类,它可以保存类型为T的值,代表这个值存在。或仅仅保存null,表示这个值不存在。原来用null表示一个值不存在,现在Optional可以更好的表达这个概念,并可以避免空指针异常。
- Javadoc描述:这是一个可以为null的容器对象。如果有值存在,则isPresent()方法会返回true,调用get()方法会返回该对象。
二、Optional类中的方法
三、Optional类应用
public class OptionalTest {
@Test
public void testOptional() {
/*
* 情况1测试
* boy是Boy类的实例对象,所以不是空,但是boy调用getGirl()时,并没有提前赋值及创建对象,故返回的是空值,
* 所以再调用getName时,就会报空指针异常
*/
Boy boy = new Boy();
String girlName = getGirlName(boy);
System.out.println(girlName);
// 情况2测试
// 用传统方法改进后,不会报空指针异常,因为boy不空,但girl为空,所以返回null
String name1 = getGirlName1(boy);
System.out.println(name1);
// 情况3测试
// 创建基于Boy对象的Optional对象,避免Boy对象为空引发的空指针异常,又因此次boy为null,故返回“古力娜扎”
boy = null;
String name2 = getGirlName2(boy);
System.out.println(name2);
// Boy对象不为空时,不会执行第一层的orElse方法,但Girl对象仍为null,所以返回“迪丽热巴”
Boy boy1 = new Boy();
String name3 = getGirlName2(boy1);
System.out.println(name3);
// Boy对象和Girl对象均不为空,所以返回自身的值 “欧阳娜娜”
Boy boy2 = new Boy(new Girl("欧阳娜娜"));
String name4 = getGirlName2(boy2);
System.out.println(name4);
}
// 上面是三种方法的测试
//-----------------------------------------------------------------
// 情况1:有空指针异常的方法
public String getGirlName(Boy boy) {
return boy.getGirl().getName();
}
// 情况2:传统方法优化getGirlName
public String getGirlName1(Boy boy) {
if (boy != null) {
Girl girl = boy.getGirl();
if (girl != null) {
String name = girl.getName();
return name;
}
}
return null;
}
// 情况3:用Optional处理getGirlname方法
public String getGirlName2(Boy boy) {
// 1.创建基于Boy对象的Optional的对象
Optional<Boy> boyOptional = Optional.ofNullable(boy);
// 2.用新建的Optional的对象的方法来执行对Boy对象的操作,
// orElse如果引用者为空,则返回括号内创建的新对象
Boy boy1 = boyOptional.orElse(new Boy(new Girl("古力娜扎")));
Girl girl = boy1.getGirl();
Optional<Girl> girlOptional = Optional.ofNullable(girl);
Girl girl1 = girlOptional.orElse(new Girl("迪丽热巴"));
return girl1.getName();
}
}
四、组合
防止空指针异常,Optional的创建和获取常用下面两种组合方式