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

原文:juejin.cn/post/7011435192803917831

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

if (...){
    throw new RuntimeException("出現異常了")
} 

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

Function 函數式接口

使用註解@FunctionalInterface標識,並且只包含一個抽象方法的接口是函數式接口函數式接口主要分爲Supplier供給型函數、Consumer消費型函數、Runnable無參無返回型函數和Function有參有返回型函數。

Function可以看作轉換型函數

Supplier 供給型函數

Supplier的表現形式爲不接受參數、只返回數據

Consumer 消費型函數

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

Runnable 無參無返回型函數

Runnable的表現形式爲即沒有參數也沒有返回值

Function函數的表現形式爲接收一個參數,並返回一個值。SupplierConsumerRunnable可以看作Function的一種特殊表現形式

使用小技巧

處理拋出異常的 if

定義函數

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

/**
 * 拋異常接口
 **/
@FunctionalInterface
public interface ThrowExceptionFunction {

    /**
     * 拋出異常信息
     *
     * @param message 異常信息
     * @return void
     **/
    void throwMessage(String message);
}

編寫判斷方法

創建工具類 VUtils 並創建一個 isTure 方法,方法的返回值爲剛纔定義的函數式接口 - ThrowExceptionFunction。ThrowExceptionFunction 的接口實現邏輯爲當參數 b 爲 true 時拋出異常

/**
 *  如果參數爲true拋出異常
 * 
 * @param b 
 * @return com.example.demo.func.ThrowExceptionFunction
 **/
public static ThrowExceptionFunction isTure(boolean b){

    return (errorMessage) -> {
        if (b){
            throw new RuntimeException(errorMessage);
        }
    };
}

使用方法

調用工具類參數參數後,調用函數式接口throwMessage方法傳入異常信息。當出入的參數爲false時正常執行

當出入的參數爲true時拋出異常

處理 if 分支操作

定義函數式接口

創建一個名爲BranchHandle的函數式接口,接口的參數爲兩個Runnable接口。這兩個兩個Runnable接口分別代表了爲truefalse時要進行的操作

/**
 * 分支處理接口
 **/
@FunctionalInterface
public interface BranchHandle {

    /**
     * 分支操作
     *
     * @param trueHandle 爲true時要進行的操作
     * @param falseHandle 爲false時要進行的操作
     * @return void
     **/
    void trueOrFalseHandle(Runnable trueHandle, Runnable falseHandle);

}

編寫判斷方法

創建一個名爲isTureOrFalse的方法,方法的返回值爲剛纔定義的函數式接口-BranchHandle

/**
 * 參數爲true或false時,分別進行不同的操作 
 * 
 * @param b 
 * @return com.example.demo.func.BranchHandle     
 **/
public static BranchHandle isTureOrFalse(boolean b){
    
    return (trueHandle, falseHandle) -> {
        if (b){
            trueHandle.run();
        } else {
            falseHandle.run();
        }
    };
}

使用方式

參數爲true時,執行trueHandle

參數爲false時,執行falseHandle

如果存在值執行消費操作,否則執行基於空的操作

定義函數

創建一個名爲 PresentOrElseHandler 的函數式接口,接口的參數一個爲 Consumer 接口。一個爲 Runnable, 分別代表值不爲空時執行消費操作和值爲空時執行的其他操作

/**
 * 空值與非空值分支處理
 */
public interface PresentOrElseHandler<T extends Object> {

    /**
     * 值不爲空時執行消費操作
     * 值爲空時執行其他的操作
     * 
     * @param action 值不爲空時,執行的消費操作
     * @param emptyAction 值爲空時,執行的操作
     * @return void    
     **/
   void presentOrElseHandle(Consumer<? super T> action, Runnable emptyAction);
   
}

編寫判斷方法

創建一個名爲isBlankOrNoBlank的方法,方法的返回值爲剛纔定義的函數式接口-PresentOrElseHandler

/**
 * 參數爲true或false時,分別進行不同的操作
 *
 * @param b
 * @return com.example.demo.func.BranchHandle
 **/
public static PresentOrElseHandler<?> isBlankOrNoBlank(String str){

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

使用方式

調用工具類參數參數後,調用函數式接口presentOrElseHandle方法傳入一個ConsumerRunnable

參數不爲空時,打印參數

參數不爲空時

總結

Function函數式接口是java 8非常重要的特性,利用好Function函數可以極大的簡化代碼。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/nsHTP-mbWx3pd9jCg68Png