在開發(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ù)
Consumer
消費型函數(shù)
Consumer
消費型函數(shù)和Supplier
剛好相反。Consumer
接收一個參數(shù),沒有返回值
Runnable
無參無返回型函數(shù)
Runnable
的表現(xiàn)形式為即沒有參數(shù)也沒有返回值
Function
函數(shù)的表現(xiàn)形式為接收一個參數(shù),并返回一個值。Supplier
、Consumer
和Runnable
可以看作Function
的一種特殊表現(xiàn)形式
基于 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
- 視頻教程:https://doc.iocoder.cn/video/
使用小技巧
處理拋出異常的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í)行
當(dāng)出入的參數(shù)為true
時拋出異常
處理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
參數(shù)為false
時,執(zhí)行falseHandle
如果存在值執(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ù)
參數(shù)不為空時
-
JAVA
+關(guān)注
關(guān)注
19文章
2973瀏覽量
104911 -
參數(shù)
+關(guān)注
關(guān)注
11文章
1846瀏覽量
32337 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4344瀏覽量
62812
原文標(biāo)題:妙用Java 8中的 Function接口,消滅if...else(非常新穎的寫法)
文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論