1. 程式人生 > 其它 >函式式介面和@FunctionalInterface

函式式介面和@FunctionalInterface

函式式介面的特點

  • 介面有且僅有一個抽象方法
  • 允許定義靜態方法和預設方法(這兩個都不是抽象方法)
  • 允許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"); }
        );