java8 Function 函式式介面的妙用
阿新 • • 發佈:2021-11-29
Function 函式式介面
使用註解@FunctionalInterface標識,並且只包含一個抽象方法的介面是函式式介面。函式式介面主要分為:
- Supplier供給型函式:Supplier的表現形式為不接受引數、只返回資料。
- Consumer消費型函式:Consumer接收一個引數,沒有返回值。
- Runnable無參無返回型函式:Runnable的表現形式為即沒有引數也沒有返回值。
- Function有參有返回型函式:Function函式的表現形式為接收一個引數,並返回一個值。
1、處理業務異常
示例:
public void isTrue(String msg){ // 業務處理... boolean conditon; if(conditon){ throw new RuntimeException(msg); } }
Function函數語言程式設計:
FuncUtil.isTure(conditon).throwMessage("測試異常");
第一步:定義一個丟擲異常的函式式介面, 消費型介面:只有引數沒有返回值
@FunctionalInterface
public interface ThrowExceptionFunction {
/**
* 丟擲異常資訊
*
* @param message 異常資訊
**/
void throwMessage(String message);
}
第二步:定義一個工具類 FuncUtil.isTure(boolean b)
/**
* 處理丟擲異常
*/
public static ThrowExceptionFunction isTure(boolean b) {
return (errorMessage) -> {
if (b) {
throw new RuntimeException(errorMessage);
}
};
}
2、處理if...else...分支操作
示例:
public void isTureOrFalse(){ // 業務處理... boolean a; if(a){ System.out.println("true 邏輯"); } else { System.out.println("false 邏輯"); } }
Function函數語言程式設計:
FuncUtil.isTureOrFalse(true)
.trueOrFalseHandle(() -> System.out.println("true 邏輯"), () -> System.out.println("false 邏輯"));
第一步:定義一個分支處理函式式介面,介面的引數為兩個Runnable介面。這兩個兩個Runnable介面分別代表了為true或false時要進行的操作
@FunctionalInterface
public interface BranchFunction {
/**
* 分支操作
*
* @param trueHandle 為true時要進行的操作
* @param falseHandle 為false時要進行的操作
**/
void trueOrFalseHandle(Runnable trueHandle, Runnable falseHandle);
}
第二步:定義一個工具類 FuncUtil.isTureOrFalse(boolean b)
/**
* 引數為true或false時,分別進行不同的操作
*/
public static BranchFunction isTureOrFalse(boolean b) {
return (trueHandle, falseHandle) -> {
if (b) {
trueHandle.run();
} else {
falseHandle.run();
}
};
}
3、處理if...else...分支操作,並消費輸入引數
示例:
public void isBlankOrNoBlank(String msg){
if(null==msg || ''==msg){
System.out.println("msg為空");
} else {
System.out.println("msg is:"+msg);
}
}
Function函數語言程式設計:
FuncUtil.isBlankOrNoBlank("test")
.presentHandle(System.out::println,
()-> System.out.println("空字串"));
第一步:定義一個PresentFunction的函式式介面,介面的引數一個為Consumer介面。一個為Runnable,分別代表值不為空時執行消費操作和值為空時執行的其他操作
public interface PresentFunction<T extends Object> {
/**
* 值不為空時執行消費操作
* 值為空時執行其他的操作
*
* @param action 值不為空時,執行的消費操作
* @param emptyAction 值為空時,執行的操作
**/
void presentHandle(Consumer<? super T> action, Runnable emptyAction);
}
第二步:定義一個工具類 FuncUtil.isTureOrFalse(boolean b)
/**
* 引數為true或false時,分別進行不同的操作
*/
public static PresentFunction<?> isBlankOrNoBlank(String str) {
return (consumer, runnable) -> {
if (str == null || str.length() == 0) {
runnable.run();
} else {
consumer.accept(str);
}
};
}