Java8 Optional判空詳解(簡(jiǎn)化判空操作)
一、導(dǎo)語
在沒有用Optional判空之前,你是否也像下面的代碼一樣判空呢?如果是,請(qǐng)往下看,Optional 相對(duì)傳統(tǒng)判空的優(yōu)勢(shì)。
傳統(tǒng)階層判空
為什么要用Optional,它到底是什么東西
你也看到了上面的那張圖,一旦代碼量大起來了,條件多了,代碼就會(huì)變得很冗余,變得難以維護(hù)。那么此時(shí)我們就有必要了解Optional了。
Optional 類是一個(gè)可以為null的容器對(duì)象。如果值存在則isPresent()方法會(huì)返回true,調(diào)用get()方法會(huì)返回該對(duì)象。Optional 是個(gè)容器:它可以保存類型T的值,或者僅僅保存null。Optional提供很多有用的方法,這樣我們就不用顯式進(jìn)行空值檢測(cè)。Optional 類的引入很好的解決空指針異常。
二、Optional使用
Optional 的方法,如下圖
Optional方法-圖1
Optional方法-圖2
方法就是這么多,其他的也不必多說,相信各位小伙伴一看就懂;如何使用,還是用代碼演示,請(qǐng)往下移步。
三、Optional實(shí)例
1.of
為非null的值創(chuàng)建一個(gè)Optional。of方法通過工廠方法創(chuàng)建Optional類。需要注意的是,創(chuàng)建對(duì)象時(shí)傳入的參數(shù)不能為null。如果傳入?yún)?shù)為null,則拋出NullPointerException 。
Optional<String> optional = Optional.of("xiaoming"); //傳入null,拋出NullPointerException Optional<Object> o = Optional.of(null);
2.ofNullable
為指定的值創(chuàng)建一個(gè)Optional,如果指定的值為null,則返回一個(gè)空的Optional。
Optional<Object> o1 = Optional.ofNullable(null);
3.isPresent
值存在返回true,否則返回false
Optional<String> optiona2 = Optional.of("xiaoming"); System.out.println(optiona2.isPresent());
4.get
Optional有值就返回,沒有拋出NoSuchElementException
Optional<Object> o1 = Optional.ofNullable(null); System.out.println(o1.get());
5.ifPresent
如果Optional有值則調(diào)用consumer處理,否則不處理
Optional<Object> o1 = Optional.ofNullable(null); o1.ifPresent(s -> System.out.println(s));
6.orElse
如果有值則將其返回,否則返回指定的其它值
Optional<Object> o1 = Optional.ofNullable(null); System.out.println(o1.orElse("輸出orElse")); // 輸出orElse
7.orElseGet
orElseGet與orElse方法類似,區(qū)別在于得到的默認(rèn)值。orElse方法將傳入的字符串作為默認(rèn)值,orElseGet方法可以接受Supplier接口的實(shí)現(xiàn)用來生成默認(rèn)值
Optional<Object> o1 = Optional.ofNullable(null); System.out.println(o1.orElseGet(() -> "default value")); // default value
*注意:orElse 和 orElseGet 看似差不多,其實(shí)有很大不同;看下面例子
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
從上面兩個(gè)例子可以看到,當(dāng)Optional 為空時(shí),orElse和orElseGet 區(qū)別不大,但當(dāng)Optional有值時(shí),orElse仍然會(huì)去調(diào)用方法創(chuàng)建對(duì)象,而orElseGet不會(huì)再調(diào)用方法;在我們處理的業(yè)務(wù)數(shù)據(jù)量大的時(shí)候,這兩者的性能就有很大的差異。
8.orElseThrow
如果有值則將其返回,否則拋出supplier接口創(chuàng)建的異常。
Optional<Object> o1 = Optional.ofNullable(null); try { o1.orElseThrow(() -> new Exception("異常!")); } catch (Exception e) { System.out.println("info:" + e.getMessage()); }//輸出:info:異常!
9.map
如果有值,則對(duì)其執(zhí)行調(diào)用mapping函數(shù)得到返回值。如果返回值不為null,則創(chuàng)建包含mapping返回值的Optional作為map方法返回值,否則返回空Optional。
Optional<String> 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<String> optional = Optional.of("xiaoming"); Optional<String> s = optional.flatMap(e -> Optional.of(e.toUpperCase())); System.out.println(s.get()); //輸出:XIAOMING
11.filter
List<String> strings = Arrays.asList("rmb", "doller", "ou"); for (String s : strings) { Optional<String> o = Optional.of(s).filter(s1 -> !s1.contains("o")); System.out.println(o.orElse("沒有不包含o的")); }//輸出: rmb 沒有不包含o的 沒有不包含o的
四、小結(jié)
Optional 是java非常有用的一個(gè)補(bǔ)充,它旨在減少代碼中的NullPointerExceptions,雖然不能百分之百的消除,但也是精心設(shè)計(jì)的。使用Optional 能更好的幫助我們創(chuàng)建可讀性強(qiáng),bug更少的應(yīng)用程序。
總結(jié)
到此這篇關(guān)于Java8 Optional判空(簡(jiǎn)化判空操作)的文章就介紹到這了,更多相關(guān)Java8 Optional判空內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決idea npm:無法將“npm”項(xiàng)識(shí)別為cmdlet、函數(shù)、腳本文件或可運(yùn)行程序的名稱問題
在IDEA中運(yùn)行npm命令時(shí)出現(xiàn)無法識(shí)別的錯(cuò)誤,通常是由于npm環(huán)境變量配置不正確引起,解決方法包括以管理員身份運(yùn)行IDEA,確認(rèn)node和npm是否正確安裝及配置環(huán)境變量,需要在系統(tǒng)環(huán)境變量中添加node.js的安裝路徑,并設(shè)置npm的全局模塊和緩存路徑2024-10-10log4j控制臺(tái)不打印日志故障的詳細(xì)解決方案
這篇文章主要給大家介紹了關(guān)于log4j控制臺(tái)不打印日志故障的詳細(xì)解決方案,log4j不提供默認(rèn)配置,因?yàn)樵谀承┉h(huán)境中可能禁止輸出到控制臺(tái)或文件系統(tǒng),需要的朋友可以參考下2023-08-08struts2.5+框架使用通配符與動(dòng)態(tài)方法常見問題小結(jié)
這篇文章主要介紹了struts2.5+框架使用通配符與動(dòng)態(tài)方法常見問題 ,在文中給大家提到了Struts2.5框架使用通配符指定方法 ,需要的朋友可以參考下2018-09-09Spring IOC源碼剖析_如何整體認(rèn)知Spring體系結(jié)構(gòu)
這篇文章主要介紹了Spring IOC源碼剖析_如何整體認(rèn)知Spring體系結(jié)構(gòu)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09基于IDEA查看maven依賴結(jié)構(gòu)流程解析
這篇文章主要介紹了基于IDEA查看maven依賴結(jié)構(gòu)流程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09Java 實(shí)現(xiàn)多線程切換等待喚醒交替打印奇偶數(shù)
這篇文章主要介紹了Java 實(shí)現(xiàn)多線程切換等待喚醒交替打印奇偶數(shù) ,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-05-05Java多線程之循環(huán)柵欄技術(shù)CyclicBarrier使用探索
這篇文章主要介紹了Java多線程之循環(huán)柵欄技術(shù)CyclicBarrier,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>2024-01-01詳解Elastic Search搜索引擎在SpringBoot中的實(shí)踐
本篇文章主要介紹了Elastic Search搜索引擎在SpringBoot中的實(shí)踐,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-01-01