作者:詩意凌風 | http://suo.im/5t3akh
導語
在沒有用Optional判空之前,你是否也像下面的代碼一樣判空呢?如果是,請往下看,Optional 相對傳統(tǒng)判空的優(yōu)勢。

傳統(tǒng)階層判空
-
為什么要用Optional,它到底是什么東西
你也看到了上面的那張圖,一旦代碼量大起來了,條件多了,代碼就會變得很冗余,變得難以維護。那么此時我們就有必要了解Optional了。
Optional 類是一個可以為null的容器對象。如果值存在則isPresent()方法會返回true,調用get()方法會返回該對象。Optional 是個容器:它可以保存類型T的值,或者僅僅保存null。Optional提供很多有用的方法,這樣我們就不用顯式進行空值檢測。Optional 類的引入很好的解決空指針異常。
-
Optional 的方法,如下圖

Optional方法-圖1

Optional方法-圖2
好,方法就是這么多,其他的也不必多說,相信各位小伙伴一看就懂;如何使用,我還是用代碼演示,請往下移步。
-
Optional實例
1.of:為非null的值創(chuàng)建一個Optional。of方法通過工廠方法創(chuàng)建Optional類。需要注意的是,創(chuàng)建對象時傳入的參數(shù)不能為null。如果傳入參數(shù)為null,則拋出NullPointerException 。
Optional?optional?=?Optional.of("xiaoming");
//傳入null,拋出NullPointerException
Optional
2.ofNullable:為指定的值創(chuàng)建一個Optional,如果指定的值為null,則返回一個空的Optional。
Optional
3.isPresent:值存在返回true,否則返回false
Optional?optiona2?=?Optional.of("xiaoming");
System.out.println(optiona2.isPresent());
4.get:Optional有值就返回,沒有拋出NoSuchElementException
Optional
5.ifPresent:如果Optional有值則調用consumer處理,否則不處理
Optional
6.orElse:如果有值則將其返回,否則返回指定的其它值
Optional
7.orElseGet:orElseGet與orElse方法類似,區(qū)別在于得到的默認值。orElse方法將傳入的字符串作為默認值,orElseGet方法可以接受Supplier接口的實現(xiàn)用來生成默認值
Optional
*注意:orElse 和 orElseGet 看似差不多,其實有很大不同;看下面例子
Shop?shop?=?null;
System.out.println("test?orElse");
Optional.ofNullable(shop).orElse(createNew());System.out.println("test?orElseGet");
Optional.ofNullable(shop).orElseGet(()->createNew());
//createNew
private?static?Shop?createNew()?{??System.out.println("create?new");
??return?new?Shop("絲襪",?50);
}//輸出:
test?orElsecreate?newtest?orElseGetcreate?new
Shop?shop?=?new?Shop("長腿絲襪",100);
System.out.println("test?orElse");
Optional.ofNullable(shop).orElse(createNew());System.out.println("test?orElseGet");
Optional.ofNullable(shop).orElseGet(()->createNew());
//輸出
test?orElsecreate?newtest?orElseGet
從上面兩個例子可以看到,當Optional 為空時,orElse和orElseGet 區(qū)別不大,但當Optional有值時,orElse仍然會去調用方法創(chuàng)建對象,而orElseGet不會再調用方法;在我們處理的業(yè)務數(shù)據量大的時候,這兩者的性能就有很大的差異。
8.orElseThrow:如果有值則將其返回,否則拋出supplier接口創(chuàng)建的異常。
Optional
9.map:如果有值,則對其執(zhí)行調用mapping函數(shù)得到返回值。如果返回值不為null,則創(chuàng)建包含mapping返回值的Optional作為map方法返回值,否則返回空Optional。
Optional?optional?=?Optional.of("xiaoming");
String?s?=?optional.map(e?->?e.toUpperCase()).orElse("shiyilingfeng");
System.out.println(s);?//輸出:?XIAOMING
10.flatMap:如果有值,為其執(zhí)行mapping函數(shù)返回Optional類型返回值,否則返回空Optional。與map不同的是,flatMap 的返回值必須是Optional,而map的返回值可以是任意的類型T
Optional?optional?=?Optional.of("xiaoming");
Optional?s?=?optional.flatMap(e?->?Optional.of(e.toUpperCase()));
System.out.println(s.get());?//輸出:XIAOMING
11.filter
List?strings?=?Arrays.asList("rmb",?"doller",?"ou");
for?(String?s?:?strings)?{
??Optional?o?=?Optional.of(s).filter(s1?->?!s1.contains("o"));
??System.out.println(o.orElse("沒有不包含o的"));
}//輸出:
rmb
沒有不包含o的
沒有不包含o的
-
小結
Optional 是java非常有用的一個補充,它旨在減少代碼中的NullPointerExceptions,雖然不能百分之百的消除,但也是精心設計的。使用Optional 能更好的幫助我們創(chuàng)建可讀性強,bug更少的應用程序。好了,今天就到這里了,喜歡的朋友,請關注小編,與小編共同成長!
特別推薦一個分享架構+算法的優(yōu)質內容,還沒關注的小伙伴,可以長按關注一下:
長按訂閱更多精彩▼
如有收獲,點個在看,誠摯感謝
免責聲明:本文內容由21ic獲得授權后發(fā)布,版權歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!