妙用 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
函數的表現形式爲接收一個參數,並返回一個值。Supplier
、Consumer
和Runnable
可以看作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
接口分別代表了爲true
或false
時要進行的操作
/**
* 分支處理接口
**/
@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
方法傳入一個Consumer
和Runnable
參數不爲空時,打印參數
參數不爲空時
總結
Function
函數式接口是java 8
非常重要的特性,利用好Function
函數可以極大的簡化代碼。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/nsHTP-mbWx3pd9jCg68Png