0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

妙用Java 8中的 Function接口,消滅if...else(非常新穎的寫法)

jf_ro2CN3Fa ? 來源:芋道源碼 ? 2023-11-10 16:23 ? 次閱讀


在開發(fā)過程中經(jīng)常會(huì)使用if...else...進(jìn)行判斷拋出異常、分支處理等操作。這些if...else...充斥在代碼中嚴(yán)重影響了代碼代碼的美觀,這時(shí)我們可以利用Java 8Function接口來消滅if...else...。

if(...){
thrownewRuntimeException("出現(xiàn)異常了");
}

if(...){
doSomething();
}else{
doOther();
}

Function 函數(shù)式接口

使用注解@FunctionalInterface標(biāo)識(shí),并且只包含一個(gè)抽象方法的接口是函數(shù)式接口。函數(shù)式接口主要分為Supplier供給型函數(shù)、Consumer消費(fèi)型函數(shù)、Runnable無參無返回型函數(shù)和Function有參有返回型函數(shù)。

Function可以看作轉(zhuǎn)換型函數(shù)

Supplier供給型函數(shù)

Supplier的表現(xiàn)形式為不接受參數(shù)、只返回?cái)?shù)據(jù)

9b94ce8c-7f69-11ee-939d-92fbcf53809c.jpg

Consumer消費(fèi)型函數(shù)

Consumer消費(fèi)型函數(shù)和Supplier剛好相反。Consumer接收一個(gè)參數(shù),沒有返回值

9ba12010-7f69-11ee-939d-92fbcf53809c.jpg

Runnable無參無返回型函數(shù)

Runnable的表現(xiàn)形式為即沒有參數(shù)也沒有返回值

9bc18c2e-7f69-11ee-939d-92fbcf53809c.jpg

Function函數(shù)的表現(xiàn)形式為接收一個(gè)參數(shù),并返回一個(gè)值。Supplier、ConsumerRunnable可以看作Function的一種特殊表現(xiàn)形式

9bcdee92-7f69-11ee-939d-92fbcf53809c.jpg

基于 Spring Boot + MyBatis Plus + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

  • 項(xiàng)目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 視頻教程:https://doc.iocoder.cn/video/

使用小技巧

處理拋出異常的if

  1. 定義函數(shù)

定義一個(gè)拋出異常的形式的函數(shù)式接口, 這個(gè)接口只有參數(shù)沒有返回值是個(gè)消費(fèi)型接口

/**
*拋異常接口
**/
@FunctionalInterface
publicinterfaceThrowExceptionFunction{

/**
*拋出異常信息
*
*@parammessage異常信息
*@returnvoid
**/
voidthrowMessage(Stringmessage);
}
  1. 編寫判斷方法

創(chuàng)建工具類VUtils并創(chuàng)建一個(gè)isTure方法,方法的返回值為剛才定義的函數(shù)式接口-ThrowExceptionFunction。ThrowExceptionFunction的接口實(shí)現(xiàn)邏輯為當(dāng)參數(shù)btrue時(shí)拋出異常

/**
*如果參數(shù)為true拋出異常
*
*@paramb
*@returncom.example.demo.func.ThrowExceptionFunction
**/
publicstaticThrowExceptionFunctionisTure(booleanb){

return(errorMessage)->{
if(b){
thrownewRuntimeException(errorMessage);
}
};
}
  1. 使用方式

調(diào)用工具類參數(shù)參數(shù)后,調(diào)用函數(shù)式接口throwMessage方法傳入異常信息。當(dāng)出入的參數(shù)為false時(shí)正常執(zhí)行

9bded234-7f69-11ee-939d-92fbcf53809c.jpg

當(dāng)出入的參數(shù)為true時(shí)拋出異常

9beeae8e-7f69-11ee-939d-92fbcf53809c.jpg

處理if分支操作

  1. 定義函數(shù)式接口

創(chuàng)建一個(gè)名為BranchHandle的函數(shù)式接口,接口的參數(shù)為兩個(gè)Runnable接口。這兩個(gè)兩個(gè)Runnable接口分別代表了為truefalse時(shí)要進(jìn)行的操作

/**
*分支處理接口
**/
@FunctionalInterface
publicinterfaceBranchHandle{

/**
*分支操作
*
*@paramtrueHandle為true時(shí)要進(jìn)行的操作
*@paramfalseHandle為false時(shí)要進(jìn)行的操作
*@returnvoid
**/
voidtrueOrFalseHandle(RunnabletrueHandle,RunnablefalseHandle);

}
  1. 編寫判斷方法

創(chuàng)建一個(gè)名為isTureOrFalse的方法,方法的返回值為剛才定義的函數(shù)式接口-BranchHandle。

/**
*參數(shù)為true或false時(shí),分別進(jìn)行不同的操作
*
*@paramb
*@returncom.example.demo.func.BranchHandle
**/
publicstaticBranchHandleisTureOrFalse(booleanb){

return(trueHandle,falseHandle)->{
if(b){
trueHandle.run();
}else{
falseHandle.run();
}
};
}
  1. 使用方式

參數(shù)為true時(shí),執(zhí)行trueHandle

9bff7a70-7f69-11ee-939d-92fbcf53809c.jpg

參數(shù)為false時(shí),執(zhí)行falseHandle

9c0a3da2-7f69-11ee-939d-92fbcf53809c.jpg

如果存在值執(zhí)行消費(fèi)操作,否則執(zhí)行基于空的操作

  1. 定義函數(shù)

創(chuàng)建一個(gè)名為PresentOrElseHandler的函數(shù)式接口,接口的參數(shù)一個(gè)為Consumer接口。一個(gè)為Runnable,分別代表值不為空時(shí)執(zhí)行消費(fèi)操作和值為空時(shí)執(zhí)行的其他操作

/**
*空值與非空值分支處理
*/
publicinterfacePresentOrElseHandler<TextendsObject>{

/**
*值不為空時(shí)執(zhí)行消費(fèi)操作
*值為空時(shí)執(zhí)行其他的操作
*
*@paramaction值不為空時(shí),執(zhí)行的消費(fèi)操作
*@paramemptyAction值為空時(shí),執(zhí)行的操作
*@returnvoid
**/
voidpresentOrElseHandle(ConsumersuperT>action,RunnableemptyAction);

}
  1. 編寫判斷方法

創(chuàng)建一個(gè)名為isBlankOrNoBlank的方法,方法的返回值為剛才定義的函數(shù)式接口-PresentOrElseHandler

/**
*參數(shù)為true或false時(shí),分別進(jìn)行不同的操作
*
*@paramb
*@returncom.example.demo.func.BranchHandle
**/
publicstaticPresentOrElseHandlerisBlankOrNoBlank(Stringstr){

return(consumer,runnable)->{
if(str==null||str.length()==0){
runnable.run();
}else{
consumer.accept(str);
}
};
}
  1. 使用方式

調(diào)用工具類參數(shù)參數(shù)后,調(diào)用函數(shù)式接口presentOrElseHandle方法傳入一個(gè)ConsumerRunnable

參數(shù)不為空時(shí),打印參數(shù)

9c1ba72c-7f69-11ee-939d-92fbcf53809c.jpg

參數(shù)不為空時(shí)

9c2cf022-7f69-11ee-939d-92fbcf53809c.jpg


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2952

    瀏覽量

    104485
  • 參數(shù)
    +關(guān)注

    關(guān)注

    11

    文章

    1757

    瀏覽量

    32044
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4284

    瀏覽量

    62325

原文標(biāo)題:妙用Java 8中的 Function接口,消滅if...else(非常新穎的寫法)

文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    消滅 Java 代碼的“壞味道”

    (list.get(list.size() - 1));} else { // 內(nèi)部可能是鏈表實(shí)現(xiàn),隨機(jī)訪問效率低}1.7.頻繁調(diào)用 Collection.contains 方法請(qǐng)使用 Set在 java 集合
    發(fā)表于 09-16 15:03

    消滅EMC三大利器的原理

    來源:互聯(lián)網(wǎng)濾波電容器、共模電感、磁珠在 EMC 設(shè)計(jì)電路是常見的身影,也是消滅電磁干擾的三大利器。文章從設(shè)計(jì)詳細(xì)分析了消滅 EMC 三大利器的原理。
    發(fā)表于 10-22 08:55

    S參數(shù)在高頻測(cè)量妙用

    S參數(shù)在高頻測(cè)量妙用在個(gè)人計(jì)算機(jī)平臺(tái)邁入 GHz階段之后,從計(jì)算機(jī)的中央處理器、顯示界面、存儲(chǔ)器總線到I/O接口,全部走入高頻傳送的國(guó)度,于是高
    發(fā)表于 07-23 11:26 ?2296次閱讀

    Java包、接口與異常處理(exception) 實(shí)驗(yàn)

    實(shí)驗(yàn) 4 包、接口與異常處理(exception) 一、實(shí)驗(yàn)?zāi)康?    了解 Java 包(package)、接口(interface)和異常處理(e
    發(fā)表于 09-23 19:00 ?1180次閱讀

    java8新特性

    java8接口聲明添加非抽象方法的實(shí)現(xiàn),也成為拓展方法。
    發(fā)表于 11-27 15:54 ?1723次閱讀

    非常新手之430單片機(jī)

    非常新手之430單片機(jī)(單片機(jī)課程設(shè)計(jì)電子密碼鎖)-文檔為非常新手之430單片機(jī)講解文檔,是一份不錯(cuò)的參考資料,感興趣的可以下載看看,,,,,,,,,,,,,,
    發(fā)表于 09-30 11:04 ?2次下載
    <b class='flag-5'>非常新</b>手之430單片機(jī)

    利用Java 8Function接口消滅if...else

    在開發(fā)過程中經(jīng)常會(huì)使用if...else...進(jìn)行判斷拋出異常、分支處理等操作。這些if...else...充斥在代碼嚴(yán)重影響了代碼代碼的美觀,這時(shí)我們可以利用Java
    的頭像 發(fā)表于 04-21 10:23 ?2629次閱讀

    JAVA8提供了Optional類來優(yōu)化這種寫法

    這種寫法是比較丑陋的,為了避免上述丑陋的寫法,讓丑陋的設(shè)計(jì)變得優(yōu)雅。JAVA8提供了Optional類來優(yōu)化這種寫法,接下來的正文部分進(jìn)行詳細(xì)說明
    的頭像 發(fā)表于 04-24 15:18 ?1037次閱讀

    Java方法調(diào)用Lua function

    Java先載入login.lua腳本并編譯,然后再獲取指定名稱的函數(shù),無參的直接使用call()方法調(diào)用,帶參的需要通過invoke(LuaValue[])傳入?yún)?shù)表。
    的頭像 發(fā)表于 09-07 10:47 ?1343次閱讀

    關(guān)于Python的“for-else”功能

    無論使用哪種編程語言,我們都會(huì)編寫“if-else”語句,但是“for-else”呢?
    發(fā)表于 09-26 14:44 ?539次閱讀

    在Pythonif...else條件語句介紹

    在 Python ,if...else 是一種條件語句,可以根據(jù)給定的條件執(zhí)行不同的操作。這個(gè)語句通常用于控制程序的流程。
    的頭像 發(fā)表于 04-19 15:43 ?1092次閱讀

    如何解決冗長(zhǎng)的if...else條件判斷(上)

    if...else...條件語句我相信學(xué)習(xí)python的童鞋們都喜歡用,例如下一面這一段 def func ( param ): if param == "cat" : print ( "這是一只
    的頭像 發(fā)表于 09-12 17:03 ?631次閱讀

    磁環(huán)在EMC妙用

    磁環(huán)在EMC妙用
    的頭像 發(fā)表于 11-27 14:48 ?731次閱讀
    磁環(huán)在EMC<b class='flag-5'>中</b>的<b class='flag-5'>妙用</b>

    電容在ESD測(cè)試整改妙用

    電容在ESD測(cè)試整改妙用
    的頭像 發(fā)表于 12-07 09:44 ?604次閱讀
    電容在ESD測(cè)試整改<b class='flag-5'>中</b>的<b class='flag-5'>妙用</b>

    verilogfunction和task的區(qū)別

    在VerilogFunction和Task是用于模塊化設(shè)計(jì)和重用代碼的兩種重要元素。它們?cè)试S開發(fā)人員將復(fù)雜的操作分解為更小的功能單元,并在需要時(shí)調(diào)用它們。雖然Function和Task在某些方面
    的頭像 發(fā)表于 02-22 15:40 ?1696次閱讀