版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第詳解Java8中Optional的常見用法目錄一、簡介二、Java8之前,空指針異常判斷三、Optional的使用1.創(chuàng)建Optional實例2.訪問Optional對象的值3.返回默認(rèn)值4.返回異常(常用)5.轉(zhuǎn)換值6.過濾值
一、簡介
Opitonal是java8引入的一個新類,目的是為了解決空指針異常問題。本質(zhì)上,這是一個包含有可選值的包裝類,這意味著Optional類既可以含有對象也可以為空。
Optional是Java實現(xiàn)函數(shù)式編程的強勁一步,并且?guī)椭诜妒街袑崿F(xiàn)。但是Optional的意義顯然不止于此。
二、Java8之前,空指針異常判斷
java在使用對象過程中,訪問任何方法或?qū)傩远伎赡軐?dǎo)致NullPointerException:
比如:Stringisocode=user.getAddress().getCountry().getIsocode().toUpperCase();
在這個小示例中,如果我們需要確保不觸發(fā)異常,就得在訪問每一個值之前對其進(jìn)行明確地檢查:
if(user!=null){
Addressaddress=user.getAddress();
}if(address!=null){
Countrycountry=address.getCountry();
}if(country!=null){
Stringisocode=country.getIsocode();
}if(isocode!=null){
isocode=isocode.toUpperCase();
}
為了簡化這個過程,我們來看看用Optional類是怎么做的。
三、Optional的使用
1.創(chuàng)建Optional實例
?重申一下,這個類型的對象可能包含值,也可能為空。你可以使用同名方法創(chuàng)建一個空的Optional。
//創(chuàng)建一個空的Optional
OptionalUserempty=Optional.empty();
//獲取Optional的值
empty.get();
?毫不奇怪,嘗試訪問emptyOpt變量的值會導(dǎo)致NoSuchElementException。
?你可以使用of()和ofNullable()方法創(chuàng)建包含值的Optional。兩個方法的不同之處在于如果你把null值作為參數(shù)傳遞進(jìn)去,of()方法會拋出NullPointerException:
Useruser=null;
OptionalUseruser=Optional.of(user);
?因此,你應(yīng)該明確對象不為null的時候使用of()。
?如果對象即可能是null也可能是非null,你就應(yīng)該使用ofNullable()方法:
Useruser=null;
OptionalUseropt=Optional.ofNullable(null);
2.訪問Optional對象的值
從Optional實例中取回實際值對象的方法之一是使用get()方法:
Stringname="John";
OptionalStringopt=Optional.ofNullable(name);
assertEquals("John",opt.get());
不過,你看到了,這個方法會在值為null的時候拋出異常。要避免異常,你可以選擇首先驗證是否有值:
方法返回值作用Optional.isPresent()boolean當(dāng)前對象為null返回false否則返回trueOptional.ifPresent(ConsumersuperTaction)void當(dāng)前對象為null,啥都不做,否則執(zhí)行函數(shù)式接口中的內(nèi)容
Useruser=newUser("湖南");
OptionalUseropt=Optional.ofNullable(user);
//opt是否為Null
System.out.println(opt.isPresent()"存在":"不存在");
//不為null時執(zhí)行的操作這里也可以寫成lambda方式
opt.ifPresent(newConsumerUser(){
@Override
publicvoidaccept(Useruser){
System.out.println(user);
});
在我們的開發(fā)中,NullPointerException可謂是隨時隨處可見,為了避免空指針異常,我們常常需要進(jìn)行一
些防御式的檢查,所以在代碼中常??梢奿f(obj!=null)這樣的判斷。幸好在JDK1.8中,java為我們提供了
一個Optional類,Optional類能讓我們省掉繁瑣的非空的判斷。下面先說一下Optional中為我們提供的方法。
接下來,我們來看看提供空值的方法。
3.返回默認(rèn)值
方法返回值作用Optional.orElse()User對象為空的時候返回默認(rèn)值Optional.orElseGet()User對象為空的時候返回函數(shù)式接口的返回值(需要我們定義)
分ptional類提供了API用以返回對象值,或者在對象為空的時候返回默認(rèn)值:orElse(),
如果有值則返回該值,否則返回傳遞給它的參數(shù)值:
Useruser=null;
Useruser1=newUser("湖南");
//當(dāng)user為空時返回orElse中的默認(rèn)值
Userresult=Optional.ofNullable(user).orElse(user1);
System.out.println(result);
//執(zhí)行結(jié)果
User(address=湖南)
?第二個同類型Api則有所不同,這個方法會在有值的時候返回值,如果沒有值,它會執(zhí)行作為參數(shù)傳入的Supplier(供應(yīng)者)函數(shù)式接口,并將返回其執(zhí)行結(jié)果:
也就是說,其返回的結(jié)果是由我們所創(chuàng)建的
Useruser=null;
//當(dāng)user為空時返回orElseGet函數(shù)式接口中定義的返回值
Userresult=Optional.ofNullable(user).orElseGet(()-newUser("默認(rèn)"));
System.out.println(result);
下面我們來看一個示例,突出二者的區(qū)別:
注意:這里的Optional不是空的哦
publicstaticvoidmain(String[]args){
Useruser=newUser("湖南");
Useruser1=(User)Optional.ofNullable(user).orElse(createUser("orElse"));
Userresult=Optional.ofNullable(user).orElseGet(()-createUser("orElseGet"));
System.out.println(result);
privatestaticUsercreateUser(Stringstr){
("{}創(chuàng)建的對象--",str);
returnnewUser("默認(rèn)值");
//執(zhí)行結(jié)果
[INFO]2025-09-1213:40:30,987(0)--[main]look.word.Optional.Demo2.createUser(Demo2.java:31):orElse創(chuàng)建的對象--
User(address=湖南)
User(address=湖南)
可以看到,這個示例中,兩個Optional對象都包含非空值,兩個方法都會返回對應(yīng)的非空值。不過,orElse()方法仍然創(chuàng)建了User對象。與之相反,orElseGet()方法不創(chuàng)建User對象。
在執(zhí)行較密集的調(diào)用時,比如調(diào)用Web服務(wù)或數(shù)據(jù)查詢,這個差異會對性能產(chǎn)生重大影響。
4.返回異常(常用)
方法返回值作用Optional.orElseThrow()void它會在對象為空的時候拋出異常,而不是返回備選的值:
除了orElse()和orElseGet()方法,Optional還定義了orElseThrow()API它會在對象為空的時候拋出異常,而不是返回備選的值:
Userresult=Optional.ofNullable(user).orElseThrow(()-newIllegalArgumentException());
這里,如果user值為null,會拋出IllegalArgumentException。
這個方法讓我們有更豐富的語義,可以決定拋出什么樣的異常,而不總是拋出NullPointerException。
現(xiàn)在我們已經(jīng)很好地理解了如何使用Optional,我們來看看其它可以對Optional值進(jìn)行轉(zhuǎn)換和過濾的方法。
5.轉(zhuǎn)換值
有很多種方法可以轉(zhuǎn)換Optional的值。我們從map()和flatMap()方法開始。
先來看一個使用map()API的例子:
Useruser=newUser("湖南");
Stringaddress=Optional.ofNullable(user).map(u-u.getAddress()).orElse("默認(rèn)!");
System.out.println(address.equals(user.getAddress())"相同":"不相同");
//執(zhí)行結(jié)果Useruser=newUser();結(jié)果為不相同
//相同
map()對值應(yīng)用(調(diào)用)作為參數(shù)的函數(shù),然后將返回的值包裝在Optional中。這就使對返回值進(jìn)行鏈試調(diào)用的操作成為可能這里的下一環(huán)就是orElse()。
相比這下,flatMap()也需要函數(shù)作為參數(shù),并對值調(diào)用這個函數(shù),然后直接返回結(jié)果。
下面的操作中,我們給User類添加了一個方法,用來返回Optional:
Useruser=newUser();
Stringaddress=Optional.ofNullable(user)
.flatMap(u-Optional.ofNullable(u.getAddress()))
.orElse("默認(rèn)!");
System.out.println(address.equals(user.getAddress())"相同":"不相同");
//執(zhí)行結(jié)果Useruser=newUser();結(jié)果為不相同
//相同
二者區(qū)別:
簡單來說:二者返回值類型不同
map()的返回值類型:比如返回的是字符串那么他的返回值類型就是字符串flatMap()的返回值類型:則是用Optional包裹的,我們還可以對他進(jìn)行一系列操作
6.過濾值
filter()接受一個Predicate參數(shù),返回測試結(jié)果為
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中職(汽車檢測與維修)汽車電器檢修階段測試題及答案
- 2025年中職面料塑性(面料處理技術(shù))試題及答案
- 2025年大學(xué)船舶機(jī)械安裝(船舶機(jī)械安裝)試題及答案
- 2025年高職(寵物醫(yī)療技術(shù))寵物寄生蟲病防治試題及答案
- 2025年大學(xué)本科(工商管理)運營管理基礎(chǔ)階段測試題及答案
- 2025年高職(自然保護(hù)地建設(shè)與管理)保護(hù)區(qū)運營階段測試試題及答案
- 2025年高職(道路橋梁工程技術(shù))橋梁施工技術(shù)階段測試題及答案
- 2026年福建水利電力職業(yè)技術(shù)學(xué)院單招綜合素質(zhì)考試模擬試題帶答案解析
- 2026年安陽學(xué)院單招綜合素質(zhì)筆試備考題庫帶答案解析
- 2026年海南工商職業(yè)學(xué)院高職單招職業(yè)適應(yīng)性測試備考試題帶答案解析
- 2026秋招:澳森特鋼集團(tuán)試題及答案
- 2026年寧夏黃河農(nóng)村商業(yè)銀行科技人員社會招聘備考題庫及答案詳解(易錯題)
- DB37-T4975-2025分布式光伏直采直控技術(shù)規(guī)范
- 脫硫廢水零排放項目施工方案
- 2026年海南衛(wèi)生健康職業(yè)學(xué)院單招綜合素質(zhì)考試題庫參考答案詳解
- 消防設(shè)施維保服務(wù)方案投標(biāo)文件(技術(shù)方案)
- 濟(jì)德高速一駐地辦工地試驗室試驗檢測計劃
- 堵漏施工方案報價
- 電線電纜使用說明書
- 幼兒園小班語言兒歌《大一歲了》課件
- 七年級數(shù)學(xué)工程問題單元試卷及答案
評論
0/150
提交評論