詳解Java中Optional類的使用方法_第1頁
詳解Java中Optional類的使用方法_第2頁
詳解Java中Optional類的使用方法_第3頁
詳解Java中Optional類的使用方法_第4頁
詳解Java中Optional類的使用方法_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第詳解Java中Optional類的使用方法目錄一、Optional類的來源二、Optional類是什么三、Optional類用法四、代碼示例1、創(chuàng)建Optional類2、判斷Optional容器中是否包含對(duì)象3、獲取Optional容器的對(duì)象4、過濾5、映射五、什么場(chǎng)景用Optional1、場(chǎng)景一2、場(chǎng)景二3、場(chǎng)景三4、場(chǎng)景四

一、Optional類的來源

到目前為止,臭名昭著的空指針異常是導(dǎo)致Java應(yīng)用程序失敗的最常見原因。以前,為了解決空指針異常,Google公司著名的Guava項(xiàng)目引入了Optional類,Guava通過使用檢查空值的方式來防止代碼污染,它鼓勵(lì)程序員寫更干凈的代碼。受到GoogleGuava的啟發(fā),Optional類已經(jīng)成為Java8類庫(kù)的一部分。

二、Optional類是什么

Optional類(java.util.Optional)是一個(gè)容器類,它可以保存類型T的值,代表這個(gè)值存在?;蛘邇H僅保存null,表示這個(gè)值不存在。原來用null表示一個(gè)值不存在,現(xiàn)在Optional可以更好的表達(dá)這個(gè)概念。并且可以避免空指針異常。

Optional提供很多有用的方法,這樣我們就不用顯式進(jìn)行空值檢測(cè)。

三、Optional類用法

Optional類的Javadoc描述如下:這是一個(gè)可以為null的容器對(duì)象。

如果值存在則isPresent()方法會(huì)返回true,調(diào)用get()方法會(huì)返回該對(duì)象。

如果值不存在則isPresent()方法會(huì)返回false,調(diào)用get()方法會(huì)NPE。

創(chuàng)建Optional類對(duì)象的方法:

Optional.of(Tt):創(chuàng)建一個(gè)Optional實(shí)例,t必須非空;

Optional.empty():創(chuàng)建一個(gè)空的Optional實(shí)例

Optional.ofNullable(Tt):t可以為null

判斷Optional容器中是否包含對(duì)象:

booleanisPresent():判斷是否包含對(duì)象

voidifPresent(ConsumersuperTconsumer):如果有值,就執(zhí)行Consumer接口的實(shí)現(xiàn)代碼,并且該值會(huì)作為參數(shù)傳給它。

獲取Optional容器的對(duì)象:

Tget():如果調(diào)用對(duì)象包含值,返回該值,否則拋異常

TorElse(Tother):如果有值則將其返回,否則返回指定的other對(duì)象。

TorElseGet(SupplierextendsTother):如果有值則將其返回,否則返回由Supplier接口實(shí)現(xiàn)提供的對(duì)象。

TorElseThrow(SupplierextendsXexceptionSupplier):如果有值則將其返回,否則拋出由Supplier接口實(shí)現(xiàn)提供的異常。

過濾:

OptionalTfilter(PredicatesuperTpredicate):如果值存在,并且這個(gè)值匹配給定的predicate,返回一個(gè)Optional用以描述這個(gè)值,否則返回一個(gè)空的Optional。

映射

UOptionalUmap(FunctionsuperT,extendsUmapper):如果有值,則對(duì)其執(zhí)行調(diào)用映射函數(shù)得到返回值。如果返回值不為null,則創(chuàng)建包含映射返回值的Optional作為map方法返回值,否則返回空Optional。

UOptionalUflatMap(FunctionsuperT,OptionalUmapper):如果值存在,就對(duì)該值執(zhí)行提供的mapping函數(shù)調(diào)用,返回一個(gè)Optional類型的值,否則就返回一個(gè)空的Optional對(duì)象

四、代碼示例

@Data

@AllArgsConstructor

@NoArgsConstructor

classStudent{

privateStringname;

privateIntegerage;

1、創(chuàng)建Optional類

publicvoidtest1(){

//聲明一個(gè)空Optional

OptionalObjectempty=Optional.empty();

//依據(jù)一個(gè)非空值創(chuàng)建Optional

Studentstudent=newStudent();

OptionalStudentos1=Optional.of(student);

//可接受null的Optional

Studentstudent1=null;

OptionalStudentos2=Optional.ofNullable(student1);

2、判斷Optional容器中是否包含對(duì)象

isPresent不帶參數(shù),判斷是否為空,ifPresent可以選擇帶一個(gè)消費(fèi)函數(shù)的實(shí)例。(isPresent和ifPresent一個(gè)是is一個(gè)是if注意一下哈)

publicvoidtest1(){

Studentstudent=newStudent();

OptionalStudentos1=Optional.ofNullable(student);

booleanpresent=os1.isPresent();

System.out.println(present);

//利用Optional的ifPresent方法做出如下:當(dāng)student不為空的時(shí)候?qū)ame賦值為張三

Optional.ofNullable(student).ifPresent(p-p.setName("張三"));

3、獲取Optional容器的對(duì)象

publicvoidtest1()throwsException{

Studentstudent=null;

OptionalStudentos1=Optional.ofNullable(student);

//使用get一定要注意,假如student對(duì)象為空,get是會(huì)報(bào)錯(cuò)的

//java.util.NoSuchElementException:Novaluepresent

Studentstudent1=os1.get();

//當(dāng)student為空的時(shí)候,返回我們新建的這個(gè)對(duì)象,有點(diǎn)像三目運(yùn)算的感覺

Studentstudent2=os1.orElse(newStudent("張三",18));

//orElseGet就是當(dāng)student為空的時(shí)候,返回通過Supplier供應(yīng)商函數(shù)創(chuàng)建的對(duì)象

Studentstudent3=os1.orElseGet(()-newStudent("張三",18));

//orElseThrow就是當(dāng)student為空的時(shí)候,可以拋出我們指定的異常

os1.orElseThrow(()-newException());

4、過濾

publicvoidtest1(){

Studentstudent=newStudent("李四",3);

OptionalStudentos1=Optional.ofNullable(student);

os1.filter(p-p.getName().equals("張三")).ifPresent(x-System.out.println("OK"));

5、映射

map代碼示例:

publicvoidtest1(){

Studentstudent=newStudent("李四",3);

OptionalStudentos1=Optional.ofNullable(student);

//如果student對(duì)象不為空,就加一歲

OptionalStudentemp=os1.map(e-

e.setAge(e.getAge()+1);

returne;

這塊的map說實(shí)話對(duì)lambda不是很熟練的理解起來是很繞腦子的。

這里的map實(shí)際上就是用的Function函數(shù),F(xiàn)unction函數(shù)是有兩個(gè)參數(shù)的,第一個(gè)是入?yún)?shù)據(jù)類型,第二個(gè)是返回?cái)?shù)據(jù)類型。Function函數(shù)作用就是傳入一個(gè)對(duì)象,然后返回一個(gè)對(duì)象,返回的對(duì)象類型可以自己設(shè)置。

T就是代表實(shí)例的泛型數(shù)據(jù)類型,就是誰調(diào)用的入?yún)⒈仨毟{(diào)用者泛型的數(shù)據(jù)類型一樣。

U就是自己說了算,調(diào)用完map之后返回什么數(shù)據(jù)類型,那么U就設(shè)置什么

flatMap代碼示例:flatMap跟map是一樣的只不過他返回的是optional對(duì)象。

publicstaticOptionalIntegerstringToInt(Strings){

try{

returnOptional.of(Integer.parseInt(s));

}catch(NumberFormatExceptione){

e.printStackTrace();

returnOptional.empty();

Optional.ofNullable(props.getProperty(name))

.flatMap(OptionalUtils::stringToInt)

.filter(i-i0)

.orElse(0);

五、什么場(chǎng)景用Optional

以前一直不懂Optional有啥用,感覺太無語了,Java8還把它當(dāng)做一個(gè)噱頭來宣傳,最近終于發(fā)現(xiàn)它的用處了,當(dāng)然不用函數(shù)式編程的話,是沒感覺的;

如下提供了幾個(gè)應(yīng)用場(chǎng)景,基本上都是開發(fā)當(dāng)中經(jīng)常遇到的。

1、場(chǎng)景一

PatientInfopatientInfo=patientInfoDao.getPatientInfoById(consultOrder.getPatientId());

if(patientInfo!=null){

consultInfoResp.setPatientHead(patientInfo.getHead());

//使用Optional和函數(shù)式編程,一行搞定,而且像說話一樣

Optional.ofNullable(patientInfo).ifPresent(p-consultInfoResp.setPatientHead(p.getHead()));

2、場(chǎng)景二

publicvoidtest1()throwsException{

Studentstudent=newStudent(null,3);

if(student==null||isEmpty(student.getName())){

thrownewException();

Stringname=student.getName();

//業(yè)務(wù)省略...

//使用Optional改造

Optional.ofNullable(student).filter(s-!isEmpty(s.getName())).orElseThrow(()-newException());

publicstaticbooleanisEmpty(CharSequencestr){

returnstr==null||str.length()==0;

3、場(chǎng)景三

publicstaticStringgetChampionName(Competitioncomp)throwsIllegalArgumentException{

if(comp!=null){

CompResultresult=comp.getResult();

if(result!=null){

Userchampion=result.getChampion();

if(champion!=null){

returnchampion.getName();

thrownewIllegalArgumentException("Thevalueofparamcompisn'tavailable.");

這個(gè)在開發(fā)中是很常見的一種邏輯。去判讀傳進(jìn)來的參數(shù)時(shí)候?yàn)榭?/p>

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論