本篇文章為大家展示了如何在Java8中使用Optional干掉空指針,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。
Optional 是個(gè)容器:它可以保存類型T的value,或者僅僅保存null。Optional提供很多有用的方法,這樣我們就不用顯式進(jìn)行空值檢測(cè),很好地解決了空指針異常處理的問(wèn)題,比如可以使用isPresent()
方法判斷value是否為null,使用get()
方法獲取value值等等。
Optional的構(gòu)造方法是私有的,實(shí)例不能new,可以使用靜態(tài)方法來(lái)創(chuàng)建:
// 1、創(chuàng)建一個(gè)包裝對(duì)象值為空的Optional對(duì)象 Optional<String> optStr = Optional.empty(); // 2、創(chuàng)建包裝對(duì)象值非空的Optional對(duì)象 Optional<String> optStr1 = Optional.of("optional"); // 3、創(chuàng)建包裝對(duì)象值允許為空的Optional對(duì)象 Optional<String> optStr2 = Optional.ofNullable(null);
看完Optional的概述,我們用一個(gè)簡(jiǎn)單的例子說(shuō)明一下:
下面這段代碼接收一個(gè)User對(duì)象,如果user為null,則拋出異常【這是一個(gè)非常常規(guī)的避免空指針異常的做法,如果沒(méi)有這步,getName會(huì)NPE】,否則返回user的name。
public String getName1(User user) { if (user == null) { throw new RuntimeException("user不能為null!"); } return user.getName(); }
如果使用Optional,應(yīng)該怎么去處理呢?
public String getName2(User user) { return Optional.ofNullable(user) // 包裝user對(duì)象,如果user為null,則返回空的Optional對(duì)象 .map(User::getName) .orElseThrow(() -> new RuntimeException("user不能為null"));// 如果有值則返回,沒(méi)有則拋出異常。 }
Optional使用靜態(tài)的ofNullable
方法將user對(duì)象進(jìn)行包裝,將可能為null的user對(duì)象保護(hù)起來(lái)。
public static <T> Optional<T> ofNullable(T value) { // empty() 方法 創(chuàng)建一個(gè)空的Optional對(duì)象, of對(duì)象在構(gòu)造Optional的時(shí)候,value如果weinull,會(huì)引發(fā)NPE return value == null ? empty() : of(value); }
orElseThrow方法接收一個(gè)Supplier 對(duì)象,這里我們?cè)趌ambda表達(dá)式那節(jié)已經(jīng)說(shuō)過(guò)了,不再贅述,感興趣可以查看:Java8的Lambda表達(dá)式,你會(huì)不?
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X { // 如果有值,直接返回值 if (value != null) { return value; } else { // 拋出異常,這個(gè)異常Supplier接口定義 throw exceptionSupplier.get(); } }
方法 | 描述 |
---|---|
empty | 返回一個(gè)空的 Optional 實(shí)例 |
filter | 如果值存在并且滿足提供的斷言, 就返回包含該值的 Optional 對(duì)象;否則返回一個(gè)空的 Optional 對(duì)象 |
map | 如果值存在,就對(duì)該值執(zhí)行提供的 mapping 函數(shù)調(diào)用 |
flatMap | 如果值存在,就對(duì)該值執(zhí)行提供的 mapping 函數(shù)調(diào)用,返回一個(gè) Optional 類型的值,否則就返 回一個(gè)空的 Optional 對(duì)象 |
get | 如果該值存在,將該值用 Optional 封裝返回,否則拋出一個(gè) NoSuchElementException 異常 |
ifPresent | 如果值存在,就執(zhí)行使用該值的方法調(diào)用,否則什么也不做 |
isPresent | 如果值存在就返回 true,否則返回 false |
of | 將指定值用 Optional 封裝之后返回,如果該值為 null,則拋出一個(gè) NullPointerException 異常 |
ofNullable | 將指定值用 Optional 封裝之后返回,如果該值為 null,則返回一個(gè)空的 Optional 對(duì)象 |
orElse | 如果有值則將其返回,否則返回一個(gè)默認(rèn)值 |
orElseGet | 如果有值則將其返回,否則返回一個(gè)由指定的 Supplier 接口生成的值 |
orElseThrow | 如果有值則將其返回,否則拋出一個(gè)由指定的 Supplier 接口生成的異常 |
上述內(nèi)容就是如何在Java8中使用Optional干掉空指針,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
文章題目:如何在Java8中使用Optional干掉空指針-創(chuàng)新互聯(lián)
文章轉(zhuǎn)載:http://www.rwnh.cn/article46/doheeg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、自適應(yīng)網(wǎng)站、網(wǎng)站維護(hù)、電子商務(wù)、全網(wǎng)營(yíng)銷推廣、靜態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容