函式式介面和@FunctionalInterface
阿新 • • 發佈:2022-05-09
函式式介面的特點
- 介面有且僅有一個抽象方法
- 允許定義靜態方法和預設方法(這兩個都不是抽象方法)
- 允許java.lang.Object中的public方法(因為任何一個函式式介面的實現,預設都繼承了Object類)
- 新增@FunctionInterface註解會讓編譯器檢查是否符合函式式介面的約束規範,但不是必須新增。沒有新增時,只要符合以上規範也認為是一個函式式介面。
- 主要用在Lambda表示式和方法引用(實際上也可認為是Lambda表示式)上。
介面型別
Supplier型:無引數、有返回值
Consumer型:有引數、無返回值
Runnable型:無引數、無返回值
Function型:有引數、有返回值
JDK中的函式式方法舉例
- java.lang.Runnable,
- java.awt.event.ActionListener,
- java.util.Comparator,
- java.util.concurrent.Callable
- java.util.function包下的介面,如Consumer、Predicate、Supplier等
用法舉例
1.用來處理異常
先定義一個函式式介面
@FunctionalInterface public interface ThrowExceptionHandler { /** * 丟擲異常資訊 * @param message */ void throwErrorMessage(String message); }
再定義處理方法
public static ThrowExceptionHandler assertsTrue(boolean flag) {
return (errorMessage) -> {
if (!flag) {
throw new RuntimeException(errorMessage);
}
};
}
呼叫上述方法測試
assertsTrue(false).throwErrorMessage("丟擲異常");
2.用來處理分支
先定義一個函式式介面
@FunctionalInterface
public interface BranchHandler {
/**
* 分支判斷
* @param trueHandler
* @param falseHandler
*/
void trueOrFalseHandler(Runnable trueHandler, Runnable falseHandler);
}
再定義一個處理方法
public static BranchHandler isTrueOrFalse(boolean flag) {
return (trueHandler, falseHandler) -> {
if (flag) {
trueHandler.run();
} else {
falseHandler.run();
}
};
}
呼叫上述方法測試
isTrueOrFalse(true).trueOrFalseHandler(
() -> { System.out.println("true"); },
() -> { System.out.println("false"); }
);