詳解Java8中Optional的常見用法_第1頁
詳解Java8中Optional的常見用法_第2頁
詳解Java8中Optional的常見用法_第3頁
詳解Java8中Optional的常見用法_第4頁
詳解Java8中Optional的常見用法_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論