Oracle官方引入Optional的意圖
官方引入Optional的本意是使用它來(lái)更優(yōu)雅的處理JAVA中最常見(jiàn)的NullPointException問(wèn)題。舉一個(gè)簡(jiǎn)單的例子,如果不使用Optional,下面的這個(gè)語(yǔ)句可能拋出異常:
String version = computer.getSoundcard().getUSB().getVersion();
當(dāng)然你可以使用如下的方式來(lái)做check:
String version = "UNKNOWN"; if(computer != null){ Soundcard soundcard = computer.getSoundcard(); if(soundcard != null){ USB usb = soundcard.getUSB(); if(usb != null){ version = usb.getVersion(); } } }
很顯然上面這種方式導(dǎo)致代碼的可讀性變低,而且你怎么能保證把所有的返回值都去check一遍? 所以Java 8中給出了Optional這個(gè)解決方案。 如果使用Optional上面的語(yǔ)句就可以寫(xiě)成如下的形式:
String name = computer.flatMap(Computer::getSoundcard) .flatMap(Soundcard::getUSB) .map(USB::getVersion) .orElse("UNKNOWN");
總結(jié)一下Optional的意圖和作用
- Optional并不能解決NullPointerException問(wèn)題,但是它提供了一種機(jī)制,這種機(jī)制可以讓方法的調(diào)用者,或者Optional變量的使用這非常明確的知道這個(gè)變量中有可能不存在任何值。這樣就會(huì)強(qiáng)迫調(diào)用這去考慮,如果沒(méi)有值自己應(yīng)該怎么去處理。
- Optional另外的一個(gè)好處就是它本身是支持流式編程。