




版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年中國(guó)氯化鈉(鹽)行業(yè)市場(chǎng)現(xiàn)狀供需分析及投資評(píng)估規(guī)劃分析研究報(bào)告
- 2025-2030年中國(guó)橡膠乳行業(yè)市場(chǎng)深度調(diào)研及競(jìng)爭(zhēng)格局與投資研究報(bào)告
- 2025-2030年中國(guó)板栗粉行業(yè)市場(chǎng)現(xiàn)狀供需分析及投資評(píng)估規(guī)劃分析研究報(bào)告
- 2025-2030年中國(guó)機(jī)場(chǎng)照明解決方案行業(yè)市場(chǎng)現(xiàn)狀供需分析及投資評(píng)估規(guī)劃分析研究報(bào)告
- 2025-2030年中國(guó)木門窗行業(yè)市場(chǎng)前景趨勢(shì)及競(jìng)爭(zhēng)格局與投資研究報(bào)告
- 2025-2030年中國(guó)曲棍球棒蠟行業(yè)市場(chǎng)現(xiàn)狀供需分析及投資評(píng)估規(guī)劃分析研究報(bào)告
- 2025-2030年中國(guó)智能虛擬代理(IVA)行業(yè)市場(chǎng)現(xiàn)狀供需分析及投資評(píng)估規(guī)劃分析研究報(bào)告
- 2025-2030年中國(guó)智能收銀行業(yè)市場(chǎng)現(xiàn)狀供需分析及投資評(píng)估規(guī)劃分析研究報(bào)告
- 2025年執(zhí)業(yè)醫(yī)師考試考點(diǎn)分布與試題及答案
- 2025-2030年中國(guó)景觀材料行業(yè)市場(chǎng)深度調(diào)研及發(fā)展趨勢(shì)與投資前景研究報(bào)告
- 收購(gòu)酒店盡調(diào)報(bào)告范本
- 專職(志愿、義務(wù))消防隊(duì)人員名單表
- 海地軟件幫助
- 有限空間作業(yè)安全隱患排查清單
- 小學(xué)心理健康教育課件《微笑的力量》
- 心理健康案例分析試題
- 繼電保護(hù)單選練習(xí)題庫(kù)及答案
- 新疆功能性高分子材料項(xiàng)目可行性研究報(bào)告
- 小升初第一講-簡(jiǎn)便運(yùn)算課件
- (198)-秦可卿課件2紅樓夢(mèng)人物藝術(shù)鑒賞
- 基于Navier-Stokes方程的圖像處理與應(yīng)用研究
評(píng)論
0/150
提交評(píng)論