Lambda 表達式是 Java 8 最大新特性(JSR 335),引入函數式程式設計範式,徹底簡化匿名內部類寫法。本文系統梳理語法規則、函數式介面、核心 API 與實戰應用模式。
傳統 Swing 事件處理:
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Click Detected");
}
});
痛點:為單一方法編寫大量樣板碼。Lambda 將「行為」作為資料傳遞。
定義:有且僅有一個抽象方法的介面(可含 default/static 方法)。
@FunctionalInterface
public interface ActionListener extends EventListener {
void actionPerformed(ActionEvent e); // 唯一抽象方法
}
JDK 內建常用函數式介面(java.util.function):
| 介面 | 方法 | 參數 | 回傳 | 用途 |
|---|---|---|---|---|
| Runnable | run | 無 | void | 無參無回傳動作 |
| Supplier<T> | get | 無 | T | 產生值 |
| Consumer<T> | accept | T | void | 消費值 |
| Function<T,R> | apply | T | R | 轉換值 |
| Predicate<T> | test | T | boolean | 條件判斷 |
| Comparator<T> | compare | T, T | int | 比較排序 |
參數列表 -> 表達式主體
(參數) -> { 陳述式塊; return 值; }
(int a, int b) -> a + b ≡ (a, b) -> a + ba -> a * 2(無參/多參需括號:() -> ..., (a,b) -> ...)a -> a * 2(塊需 { return a * 2; })public class LambdaTest {
// 自訂函數式介面
interface MathOperation { int operation(int a, int b); }
interface GreetingService { void sayMessage(String message); }
interface Runnable { void run(); }
public static void main(String[] args) {
LambdaTest tester = new LambdaTest();
// 1. 多種寫法實作 MathOperation
MathOperation add = (int a, int b) -> a + b; // 完整型別
MathOperation sub = (a, b) -> a - b; // 省略型別
MathOperation mul = (int a, int b) -> { return a * b; }; // 區塊+return
MathOperation div = (int a, int b) -> a / b; // 簡潔型
// 呼叫輔助方法
System.out.println("10 + 5 = " + tester.operate(10, 5, add));
System.out.println("10 - 5 = " + tester.operate(10, 5, sub));
System.out.println("10 * 5 = " + tester.operate(10, 5, mul));
System.out.println("10 / 5 = " + tester.operate(10, 5, div));
// 2. GreetingService:單參數括號可省略
GreetingService greet1 = message -> System.out.println("Hello " + message);
GreetingService greet2 = (message) -> System.out.println("Hello " + message);
greet1.sayMessage("Mahesh");
greet2.sayMessage("Suresh");
// 3. 無參 Runnable
Runnable runTest = () -> System.out.println("Running");
runTest.run();
}
private int operate(int a, int b, MathOperation op) {
return op.operation(a, b);
}
}
list.stream().filter(...).map(...).collect(...)executor.submit(() -> doWork())list.sort((a, b) -> a.getName().compareTo(b.getName()))button.onClick(() -> handleClick())Lambda 只是呼叫現有方法時,可用方法引用更簡潔:
| 類型 | 語法 | 範例 | 等價 Lambda |
|---|---|---|---|
| 靜態方法 | 類別::方法 | Integer::parseInt | s -> Integer.parseInt(s) |
| 實例方法 | 實例::方法 | System.out::println | x -> System.out.println(x) |
| 任意物件實例方法 | 類別::方法 | String::length | (s) -> s.length() |
| 建構子 | 類別::new | ArrayList::new | () -> new ArrayList() |
final 或實際上 final(未重新賦值)的區域變數Lambda 表達式讓 Java 擁有了「函數即公民」的能力:
掌握 Lambda,是邁向現代 Java 開發(Spring 5+、Reactive Streams、微服務)的必經之路。