您好,登錄后才能下訂單哦!
前言
在前面簡單介紹了stream 流的使用,這篇博客主要介紹optional類的使用。
知道 Google 的 Guava 的同學(xué),一定知道jdk的很多都是借鑒guava里面的思想來進行升級的,optional就是其中之一,早在java 6時,Guava 就提供了 Optional > 的實現(xiàn)。
言歸正傳,開始干
NullPointerException 是編碼過程中必須要處理的防御式檢查,我們可能用if(null != user) 或者 Objects.isNull(user)等方式處理,再jdk1.8之后,你可以優(yōu)雅的處理這個問題
定義
Optional 類是一個可以為null的容器對象。如果值存在則isPresent()方法會返回true,調(diào)用get()方法會返回該對象。
Optional 是個容器:它可以保存類型T的值,或者僅僅保存null。Optional提供很多有用的方法,這樣我們就不用顯式進行空值檢測。
Optional 類的引入很好的解決空指針異常。
方法實例演示
例舉幾個常用的函數(shù),然后進行實際使用分析
of
//創(chuàng)建一個值為張三的String類型的Optional
Optional ofOptional = Optional.of("李四");
//如果我們用of方法創(chuàng)建Optional對象時,所傳入的值為null,則拋出NullPointerException
Optional nullOptional = Optional.of(null);
of的用法實際上就是靜態(tài)工廠方法,示例如下:
@Data
public class Card {
private String name;
private String number;
private Card() {}
private Card(String name,String number) {
this.name = name;
this.number = number;
}
public static Card of() {
return new Card();
}
public static Card of(String name,String number) {
return new Card(name,number);
}
}
目前,靜態(tài)工廠方法比較流行,如果目標(biāo)類類不需要子類化,非常推薦使用這種方式。
get
如果創(chuàng)建的Optional對象中有值存在則返回此值,如果沒有值存在,則會拋出
NoSuchElementException異常
ofNullable
//為指定的值創(chuàng)建Optional對象,不管所傳入的值為null不為null,創(chuàng)建的時候都不會報錯
Optional nullOptional = Optional.ofNullable(null);
Optional noNullOptional = Optional.ofNullable("李四");
System.out.println(nullOptional.get());//拋出異常 NoSuchElementException: No value present
System.out.println(noNullOptional.get());//李四
empty
//創(chuàng)建一個空的String類型的Optional對象
Optional emptyOptional = Optional.empty();
System.out.println(emptyOptional .get());//拋出異常 NoSuchElementException
orElse
存在就返回該值,不存在就返回默認值
Optional stringOptional = Optional.of("張三");
System.out.println(stringOptional.orElse("zhangsan"));//張三
Optional emptyOptional = Optional.empty();
System.out.println(emptyOptional.orElse("李四"));//李四
orElseThrow
如果創(chuàng)建的Optional中有值存在,則返回此值,否則拋出一個由指定的Supplier接口生成的異常
Optional stringOptional = Optional.of("張三");
System.out.println(stringOptional.orElseThrow(Exception::new));
map鄭州婦科醫(yī)院 http://www.zykdfkyy.com/
如果創(chuàng)建的Optional中的值存在,對該值執(zhí)行提供的Function函數(shù)調(diào)用
map方法執(zhí)行傳入的lambda表達式參數(shù)對Optional實例的值進行修改,修改后的返回值仍然是一個Optional對象
Optional stringOptional = Optional.of("張三");
System.out.println(stringOptional.map(e -> e.toUpperCase()).orElse("不能為空"));
stringOptional = Optional.empty();
System.out.println(stringOptional.map(e -> e.toUpperCase()).orElse("不能為空"));
filter
如果創(chuàng)建的Optional中的值滿足filter中的條件,則返回包含該值的Optional對象,否則返回一個空的Optional對象
Optional stringOptional = Optional.of("張三");
System.out.println(stringOptional.filter(e -> e.equals("張三")));//Optional[張三]
System.out.println(stringOptional.filter(e -> !e.equals("張三")).orElse("李四"));//張三
stringOptional = Optional.empty();
System.out.println(stringOptional.filter(e -> e.equals("張三")).orElse("李四"));//李四
flagMap
flatMap與map(Funtion)方法類似,區(qū)別在于flatMap中的mapper返回
值必須是Optional,map方法的mapping函數(shù)返回值可以是任何類型T
Optional stringOptional = Optional.of("張三");
System.out.println(stringOptional.flatMap(e -> Optional.of("李四")).orElse("不能為空"));
可能看到這兒之后并沒有感覺到多么好用,該寫的判斷還是要寫,咱們繼續(xù)
實際使用
Person p = new Person("李四",11);//如果 p = null 拋出"年齡不能為空"異常
Integer orElseThrow = Optional.ofNullable(p)
.map(s -> s.getAge())//返回參數(shù)為年齡的function
.map(b ->b + 1)//返回參數(shù)為年齡+ 1 的function
.filter(m -> m.compareTo(10) == 1)//如果年齡大于10則保留,小于10則過濾掉
.orElseThrow(() -> new Exception("年齡不合法"));//如果為空則拋出該異常
System.out.println(orElseThrow);//12
這種用法可以對單條或多條(配合foreach)能簡化大量代碼和判斷,通過拋出統(tǒng)一異常,使用異常攔截器進行攔截,統(tǒng)一處理,能很大程度上提高開發(fā)效率和代碼閱讀性。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。