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

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

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

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

Android編程精選 ? 來源:juejin.cn/post/ ? 作者:juejin.cn/post/ ? 2022-04-21 10:23 ? 次閱讀

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

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

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

Function 函數(shù)式接口

使用注解@FunctionalInterface標識,并且只包含一個抽象方法的接口是函數(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

Consumer消費型函數(shù)

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

9f7e14da-c09e-11ec-bce3-dac502259ad0.jpg

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

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

9f8fdaa8-c09e-11ec-bce3-dac502259ad0.jpg

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

9fa29756-c09e-11ec-bce3-dac502259ad0.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

  1. 定義函數(shù)

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

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

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

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

/**
*如果參數(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方法傳入異常信息。當出入的參數(shù)為false時正常執(zhí)行

9fb69030-c09e-11ec-bce3-dac502259ad0.jpg

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

9fc77472-c09e-11ec-bce3-dac502259ad0.jpg

處理if分支操作

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

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

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

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

}
  1. 編寫判斷方法

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

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

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

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

9fda6e06-c09e-11ec-bce3-dac502259ad0.jpg

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

9fe64ef6-c09e-11ec-bce3-dac502259ad0.jpg

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

  1. 定義函數(shù)

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

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

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

}
  1. 編寫判斷方法

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

/**
*參數(shù)為true或false時,分別進行不同的操作
*
*@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方法傳入一個ConsumerRunnable

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

9ff6e298-c09e-11ec-bce3-dac502259ad0.jpg

參數(shù)不為空時

-End-

審核編輯 :李倩


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

    關(guān)注

    19

    文章

    2943

    瀏覽量

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

    關(guān)注

    3

    文章

    4237

    瀏覽量

    61967

原文標題:妙用Java8中的“Function”消滅if...else!

文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    華納云:java web和java有什么區(qū)別java web和java有什么區(qū)別

    的平臺,Java可以用于開發(fā)桌面應用程序、移動應用程序、企業(yè)級應用程序等。 – Java Web是Java語言在Web開發(fā)領(lǐng)域的應用,它使用Java技術(shù)
    的頭像 發(fā)表于 07-16 13:35 ?330次閱讀
    華納云:<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ū)別

    verilog task和function區(qū)別

    verilog中的task和function都是用于實現(xiàn)模塊中的可重復的功能,并且可以接收參數(shù)和返回結(jié)果。但是它們在編寫和使用上有一些區(qū)別。下面將詳細介紹task和function的區(qū)別。 語法結(jié)構(gòu)
    的頭像 發(fā)表于 02-22 15:53 ?724次閱讀

    verilog中function和task的區(qū)別

    非常相似,但它們在功能和使用方式上有一些重要的區(qū)別。 定義和聲明方式不同: Function:使用關(guān)鍵字"function"定義和聲明。函數(shù)可以有一個或多個輸入?yún)?shù),可以有一個返回值。函數(shù)必須在聲明之后直接定義,不能在其他函數(shù)
    的頭像 發(fā)表于 02-22 15:40 ?1322次閱讀

    Java各種類的區(qū)別

    Java中的類可以分為以下幾種類型:基本類、包裝類、自定義類、抽象類、接口類和內(nèi)部類。 基本類: 基本類是Java語言中最基本的類,主要用于描述基本數(shù)據(jù)類型(如整型、浮點型、字符型等)。Jav
    的頭像 發(fā)表于 12-03 11:08 ?7361次閱讀

    Verilog代碼:if-else和case的電路結(jié)構(gòu)和區(qū)別

    導致設(shè)計的更大延時,為了避免較大的路徑延遲,最好不要使用特別長的嵌套if結(jié)構(gòu)。如想利用if語句實現(xiàn)那些對延時要求苛刻的路徑時,應將最高優(yōu)先級給最遲到達的關(guān)鍵信號。
    的頭像 發(fā)表于 11-29 15:10 ?2061次閱讀

    簡單了解Java的新特性

    Java 8Java 20,Java 已經(jīng)走過了漫長的道路,自 Java 8 以來,
    的頭像 發(fā)表于 11-23 16:38 ?867次閱讀
    簡單了解<b class='flag-5'>Java</b>的新特性

    java接口是特殊的抽象類嗎

    Java接口是一種特殊的抽象類嗎? 在Java編程語言中,接口(interface)與抽象類(abstract class)是兩種不同的概念,盡管它們之間存在一些相似之處,但在設(shè)計和使
    的頭像 發(fā)表于 11-21 10:07 ?525次閱讀

    Java中抽象類和接口的介紹

    Java是一種面向?qū)ο蟮木幊陶Z言,提供了抽象類和接口兩種機制幫助開發(fā)人員組織和管理代碼。本文將詳細介紹Java語言中抽象類和接口的概念、特
    的頭像 發(fā)表于 11-21 09:47 ?379次閱讀

    java接口和抽象類的區(qū)別

    Java中的接口(Interface)和抽象類(Abstract class)都是抽象的概念,它們可以用來定義類的行為和特征。雖然它們具有一些相似之處,但也存在一些重要的區(qū)別。本文將詳盡介紹Java
    的頭像 發(fā)表于 11-21 09:45 ?438次閱讀

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

    使用注解@FunctionalInterface標識,并且只包含一個抽象方法的接口是函數(shù)式接口。函數(shù)式接口主要分為Supplier供給型函數(shù)、Consumer消費型函數(shù)、Runnable無參無返回型函數(shù)和
    的頭像 發(fā)表于 11-10 16:23 ?769次閱讀
    妙用<b class='flag-5'>Java</b> <b class='flag-5'>8</b>中的 <b class='flag-5'>Function</b><b class='flag-5'>接口</b>,<b class='flag-5'>消滅</b><b class='flag-5'>if...else</b>(非常新穎的寫法)

    函數(shù)式接口的應用知識點

    )對java.util.function包進行解讀 (原理篇)介紹函數(shù)式接口的實現(xiàn)原理 應用篇將階段相關(guān)的JDK源碼以及給出典型的示例代碼 原理篇則從編譯、JVM維度分析函數(shù)式接口
    的頭像 發(fā)表于 10-13 11:32 ?532次閱讀
    函數(shù)式<b class='flag-5'>接口</b>的應用知識點

    Java8的新特性

    雖然目前Java最新版本都已經(jīng)到16了,但是絕大部分公司目前用的Java版本都是8,想當初Java8問世后,其Lambda表達式與方法引用可是最亮眼的新特性,目前,這兩個特性也被大家廣
    的頭像 發(fā)表于 10-10 17:12 ?431次閱讀

    Java序列化怎么使用

    java.io.Serializable 接口 public interface Serializable {} Serializable 接口沒有定義任何的方法,是一個空接口。為
    的頭像 發(fā)表于 10-10 14:19 ?351次閱讀

    java 8的日期用法

    java 已經(jīng)出到 17 了,而小編還在用 8 的版本,在 8 中已經(jīng)推出了新的日期 API,不在使用 。java.time 包下提供了用于日期、時間、實例和周期的主要 API。 獲取
    的頭像 發(fā)表于 10-09 15:50 ?349次閱讀

    如何通過注解優(yōu)化我們的Java代碼

    Java注解可以說是我們編碼過程中最常用的。本篇文章將給大家介紹Java注解的概念、作用以及如何使用注解提升代碼的可讀性和靈活性,并介紹如何通過注解優(yōu)化我們的
    的頭像 發(fā)表于 09-30 11:39 ?509次閱讀