-
Function
函數(shù)式接口-
Supplier
供給型函數(shù) -
Consumer
消費型函數(shù) -
Runnable
無參無返回型函數(shù) -
Function
函數(shù)的表現(xiàn)形式為接收一個參數(shù),并返回一個值。Supplier
、Consumer
和Runnable
可以看作Function
的一種特殊表現(xiàn)形式
-
- 使用小技巧
在開發(fā)過程中經(jīng)常會使用if...else...
進(jìn)行判斷拋出異常、分支處理等操作。這些if...else...
充斥在代碼中嚴(yán)重影響了代碼代碼的美觀,這時我們可以利用Java 8
的Function
接口來消滅if...else...
。
if(...){
thrownewRuntimeException("出現(xiàn)異常了");
}
if(...){
doSomething();
}else{
doOther();
}
Function
函數(shù)式接口
使用注解@FunctionalInterface
標(biāo)識,并且只包含一個抽象方法
的接口是函數(shù)式接口
。函數(shù)式接口
主要分為Supplier
供給型函數(shù)、Consumer
消費型函數(shù)、Runnable
無參無返回型函數(shù)和Function
有參有返回型函數(shù)。
Function
可以看作轉(zhuǎn)換型函數(shù)
Supplier
供給型函數(shù)
Supplier
的表現(xiàn)形式為不接受參數(shù)、只返回數(shù)據(jù)
![9f6cb94c-c09e-11ec-bce3-dac502259ad0.jpg](https://file1.elecfans.com//web2/M00/95/37/wKgZomTm-RuAcED8AAAygmbdq9E308.jpg)
Consumer
消費型函數(shù)
Consumer
消費型函數(shù)和Supplier
剛好相反。Consumer
接收一個參數(shù),沒有返回值
![9f7e14da-c09e-11ec-bce3-dac502259ad0.jpg](https://file1.elecfans.com//web2/M00/95/37/wKgZomTm-RuABuNtAABMQXGDj7s924.jpg)
Runnable
無參無返回型函數(shù)
Runnable
的表現(xiàn)形式為即沒有參數(shù)也沒有返回值
![9f8fdaa8-c09e-11ec-bce3-dac502259ad0.jpg](https://file1.elecfans.com//web2/M00/95/37/wKgZomTm-RuAcPslAABBvqJoA7Y921.jpg)
Function
函數(shù)的表現(xiàn)形式為接收一個參數(shù),并返回一個值。Supplier
、Consumer
和Runnable
可以看作Function
的一種特殊表現(xiàn)形式
![9fa29756-c09e-11ec-bce3-dac502259ad0.jpg](https://file1.elecfans.com//web2/M00/95/37/wKgZomTm-RyANt2dAAA9SDabPaE287.jpg)
基于 Spring Boot + MyBatis Plus + Vue & Element 實現(xiàn)的后臺管理系統(tǒng) + 用戶小程序,支持 RBAC 動態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能。
項目地址:https://github.com/YunaiV/ruoyi-vue-pro
使用小技巧
處理拋出異常的if
- 定義函數(shù)
定義一個拋出異常的形式的函數(shù)式接口
, 這個接口只有參數(shù)沒有返回值是個消費型接口
/**
*拋異常接口
**/
@FunctionalInterface
publicinterfaceThrowExceptionFunction{
/**
*拋出異常信息
*
*@parammessage異常信息
*@returnvoid
**/
voidthrowMessage(Stringmessage);
}
- 編寫判斷方法
創(chuàng)建工具類VUtils
并創(chuàng)建一個isTure
方法,方法的返回值為剛才定義的函數(shù)式接口
-ThrowExceptionFunction
。ThrowExceptionFunction
的接口實現(xiàn)邏輯為當(dāng)參數(shù)b
為true
時拋出異常
/**
*如果參數(shù)為true拋出異常
*
*@paramb
*@returncom.example.demo.func.ThrowExceptionFunction
**/
publicstaticThrowExceptionFunctionisTure(booleanb){
return(errorMessage)->{
if(b){
thrownewRuntimeException(errorMessage);
}
};
}
- 使用方式
調(diào)用工具類參數(shù)參數(shù)后,調(diào)用函數(shù)式接口
的throwMessage
方法傳入異常信息。當(dāng)出入的參數(shù)為false
時正常執(zhí)行
![9fb69030-c09e-11ec-bce3-dac502259ad0.jpg](https://file1.elecfans.com//web2/M00/95/37/wKgZomTm-RyATM30AAArBHQDLP0096.jpg)
當(dāng)出入的參數(shù)為true
時拋出異常
![9fc77472-c09e-11ec-bce3-dac502259ad0.jpg](https://file1.elecfans.com//web2/M00/95/37/wKgZomTm-RyACbvUAAAnmgSEmow296.jpg)
處理if分支操作
- 定義函數(shù)式接口
創(chuàng)建一個名為BranchHandle
的函數(shù)式接口,接口的參數(shù)為兩個Runnable
接口。這兩個兩個Runnable
接口分別代表了為true
或false
時要進(jìn)行的操作
/**
*分支處理接口
**/
@FunctionalInterface
publicinterfaceBranchHandle{
/**
*分支操作
*
*@paramtrueHandle為true時要進(jìn)行的操作
*@paramfalseHandle為false時要進(jìn)行的操作
*@returnvoid
**/
voidtrueOrFalseHandle(RunnabletrueHandle,RunnablefalseHandle);
}
- 編寫判斷方法
創(chuàng)建一個名為isTureOrFalse
的方法,方法的返回值為剛才定義的函數(shù)式接口
-BranchHandle
。
/**
*參數(shù)為true或false時,分別進(jìn)行不同的操作
*
*@paramb
*@returncom.example.demo.func.BranchHandle
**/
publicstaticBranchHandleisTureOrFalse(booleanb){
return(trueHandle,falseHandle)->{
if(b){
trueHandle.run();
}else{
falseHandle.run();
}
};
}
- 使用方式
參數(shù)為true
時,執(zhí)行trueHandle
![9fda6e06-c09e-11ec-bce3-dac502259ad0.jpg](https://file1.elecfans.com//web2/M00/95/37/wKgZomTm-RyAddGDAAA2Ta0tyQk922.jpg)
參數(shù)為false
時,執(zhí)行falseHandle
![9fe64ef6-c09e-11ec-bce3-dac502259ad0.jpg](https://file1.elecfans.com//web2/M00/95/37/wKgZomTm-RyAV3kKAAAunei0xfk327.jpg)
如果存在值執(zhí)行消費操作,否則執(zhí)行基于空的操作
- 定義函數(shù)
創(chuàng)建一個名為PresentOrElseHandler
的函數(shù)式接口,接口的參數(shù)一個為Consumer
接口。一個為Runnable
,分別代表值不為空時執(zhí)行消費操作和值為空時執(zhí)行的其他操作
/**
*空值與非空值分支處理
*/
publicinterfacePresentOrElseHandler<TextendsObject>{
/**
*值不為空時執(zhí)行消費操作
*值為空時執(zhí)行其他的操作
*
*@paramaction值不為空時,執(zhí)行的消費操作
*@paramemptyAction值為空時,執(zhí)行的操作
*@returnvoid
**/
voidpresentOrElseHandle(Consumer?superT>action,RunnableemptyAction);
}
- 編寫判斷方法
創(chuàng)建一個名為isBlankOrNoBlank
的方法,方法的返回值為剛才定義的函數(shù)式接口
-PresentOrElseHandler
。
/**
*參數(shù)為true或false時,分別進(jìn)行不同的操作
*
*@paramb
*@returncom.example.demo.func.BranchHandle
**/
publicstaticPresentOrElseHandler>isBlankOrNoBlank(Stringstr){
return(consumer,runnable)->{
if(str==null||str.length()==0){
runnable.run();
}else{
consumer.accept(str);
}
};
}
- 使用方式
調(diào)用工具類參數(shù)參數(shù)后,調(diào)用函數(shù)式接口
的presentOrElseHandle
方法傳入一個Consumer
和Runnable
參數(shù)不為空時,打印參數(shù)
![9ff6e298-c09e-11ec-bce3-dac502259ad0.jpg](https://file1.elecfans.com//web2/M00/95/37/wKgZomTm-RyAZrs3AAAxUCKnsOk584.jpg)
參數(shù)不為空時
-End-
-
JAVA
+關(guān)注
關(guān)注
19文章
2975瀏覽量
105201 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4346瀏覽量
62999
原文標(biāo)題:妙用Java8中的“Function”消滅if...else!
文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
利用FPGA實現(xiàn)USB 2.0通信接口
![<b class='flag-5'>利用</b>FPGA實現(xiàn)USB 2.0通信<b class='flag-5'>接口</b>](https://file1.elecfans.com/web3/M00/04/41/wKgZPGdyN0qASQa0AAAlMku5g24934.png)
Java 23功能介紹
![<b class='flag-5'>Java</b> 23功能介紹](https://file1.elecfans.com/web3/M00/00/FA/wKgZO2dPuOmAC6YoAAAZQa1ialc743.png)
Java集合API的改進(jìn)介紹
![<b class='flag-5'>Java</b>集合API的改進(jìn)介紹](https://file1.elecfans.com/web2/M00/0D/0F/wKgaomc_9xKALcceAAAfW4_9zrE601.jpg)
Java 枚舉與策略模式、函數(shù)式接口的結(jié)合:實現(xiàn)高內(nèi)聚低耦合的設(shè)計
能否利用TSW1400來控制TX7316脈沖信號的發(fā)射,接收,波束形成?
華納云:java web和java有什么區(qū)別java web和java有什么區(qū)別
![華納云:<b class='flag-5'>java</b> web和<b class='flag-5'>java</b>有什么區(qū)別<b class='flag-5'>java</b> web和<b class='flag-5'>java</b>有什么區(qū)別](https://file1.elecfans.com/web2/M00/FD/AC/wKgaomaWBouAMAnAAAAglmvluP4293.png)
接口測試的工具有哪些種類
5芯M8接口的靈敏度怎么樣
![5芯M<b class='flag-5'>8</b><b class='flag-5'>接口</b>的靈敏度怎么樣](https://file1.elecfans.com/web2/M00/E7/FA/wKgZomZNpu6AZXOcAADRYOF7YoU600.png)
Oracle確認(rèn)Java/JDK 11官方支持延長至2032年1月?
深入理解Java 8內(nèi)存管理機(jī)制及故障排查實戰(zhàn)指南
![深入理解<b class='flag-5'>Java</b> <b class='flag-5'>8</b>內(nèi)存管理機(jī)制及故障排查實戰(zhàn)指南](https://file1.elecfans.com/web2/M00/C7/05/wKgaomYFQnWABmUZAAAR8TkUyXc506.jpg)
M12 8芯接口鍵控
![M12 <b class='flag-5'>8</b>芯<b class='flag-5'>接口</b>鍵控](https://file1.elecfans.com/web2/M00/C4/A1/wKgZomX1WBqAaK5oAABg5-R4-R0633.png)
評論