直接从问题、需求出发。
对于这样一串代码:
String version = computer.getSoundcard().getUSB().getVersion();
在任意一个方法被调用时,都可能抛出 NullPointException 空指针异常。
所以这串代码的正确书写方式是:
String version = "UNKNOWN";
if(computer != null){
Soundcard soundcard = computer.getSoundcard();
if(soundcard != null){
USB usb = soundcard.getUSB();
if(usb != null){
version = usb.getVersion();
}
}
}
问题来了,这样写逻辑上没问题,但是代码不美观、且不友好。
Optional就是为了解决重复写if,重复判断null值这个问题而来的。
Optional的写法:
String version = Optional.ofNullable(computer)
.map(Computer::getSoundcard)
.map(Soundcard::getUSB)
.map(USB::getVersion)
.orElse("UNKNOWN");
解释:
String version = Optional.ofNullable(computer)
将computer放进optional中
.map(Computer::getSoundcard)
将getSoundcard的结果值(不管是否为null)放进新的optional中
.map(Soundcard::getUSB)
将getUSB的结果值(不管是否为null)放进新的optional
.map(USB::getVersion)
将getVersion的结果值(不管是否为null)放进新的optional
.orElse("UNKNOWN");
最后,orElse()如果获取到的值不为null,则返回该值;如果是null,使用“UNKNOWN”代替最终的返回结果。
意义:
Optional的意义在于,将需要重复判断null的过程,放在最后orElse()方法中判断一次,并给出在获取不到最终目标值的情况下的替代方案。
注意:
上面的代码很明显可以看出,要实现该过程,需要lambda函数式编程配合。
网友评论