單一抽象方法介面(SAM)在 Java 8 重新命名為函數式介面,專為 Lambda 表達式服務。Runnable, Comparator, Callable 皆為經典例子。
// Java 7 匿名內部類
new Thread(new Runnable() {
@Override public void run() { System.out.println("Anonymous"); }
}).start();
// Java 8 Lambda
new Thread(() -> System.out.println("Lambda")).start();
編譯時驗證:介面必須僅有一個抽象方法,否則報錯。
@FunctionalInterface
interface MyFunc {
void doSomething();
// void another(); // 編譯錯誤:多於一個抽象方法
}
Java 8 允許介面定義預設實現,解決介面擴展破壞現有實現類的問題:
@FunctionalInterface
interface MyFunc {
void doSomething();
default void another() { System.out.println("Default impl"); }
}
// 現在合法:only one abstract method
| 介面 | 參數 | 返回 | 用途 |
|---|---|---|---|
| Predicate<T> | T | boolean | 條件判斷 |
| Consumer<T> | T | void | 消費操作 |
| Function<T,R> | T | R | 轉換操作 |
| Supplier<T> | 無 | T | 供給操作 |
| UnaryOperator<T> | T | T | 一元運算 |
| BinaryOperator<T> | T, T | T | 二元運算 |
@FunctionalInterface — 文檔化並獲編譯器保護java.util.function 介面 — 通用、可組合System.out::println 替代 x -> System.out.println(x)