Lambda 表達式 是 Java 8 引入的核心語法糖,讓開發者能以極簡潔的方式定義「可傳遞的代碼塊」。它並非方法,而是函數式接口的匿名實現。Python、Swift 等現代語言早已支援類似特性,Java 8 正式跟進,極大提升了代碼表達力。
(parameters) -> expression
(parameters) -> { statements; }
s -> System.out.println(s)return// Java 7
for (String s : list) { System.out.println(s); }
// Java 8
list.forEach(s -> System.out.println(s));
// 方法引用更簡潔
list.forEach(System.out::println);
// Java 7 匿名內部類
Collections.sort(list, new Comparator<String>() {
public int compare(String p1, String p2) { return p1.compareTo(p2); }
});
// Java 8 Lambda + 類型推斷
Collections.sort(list, (p1, p2) -> p1.compareTo(p2));
// List 自帶 sort 方法
list.sort((p1, p2) -> p1.compareTo(p2));
// Java 7
new Thread(new Runnable() {
public void run() { System.out.println("Hello world!"); }
}).start();
// Java 8
new Thread(() -> System.out.println("Hello world!")).start();
函數式接口 = 僅有一個抽象方法的接口。Java 8 在 java.util.function 定義了豐富的標準接口:
| 接口 | 輸入 | 輸出 | 典型場景 |
|---|---|---|---|
Function<T,R> | T | R | 轉換/映射 |
Predicate<T> | T | boolean | 過濾/判斷 |
Supplier<T> | 無 | T | 延遲生成/工廠 |
Consumer<T> | T | void | 消費/副作用 |
UnaryOperator<T> | T | T | 同類型轉換 |
BiFunction<T,U,R> | T,U | R | 雙參數轉換 |
BinaryOperator<T> | T,T | T | 歸約/聚合 |
常見舊接口 Runnable、Callable、Comparator 同樣屬於函數式接口。自定義時建議加 @FunctionalInterface 註解,編譯器會強制校驗。
final 或 effectively final 變量Lambda 配合 Stream API 實現聲明式集合操作(filter/map/reduce/collect 等),是 Java 自泛型、註解以來最大的語言變革。下一篇將深入講解 Stream。