為什麼需要 Lambda?
Java SE 5 泛型以來最大語言變革。三大驅動力:
- 更緊湊代碼:替代冗長匿名內部類(Runnable、Callable、Listener 等)
- 行為參數化:將代碼作為數據傳遞,動態定制方法邏輯(如忽略大小寫查找)
- 多核並行:配合 Stream API,輕鬆並行處理大集合(filter/map/reduce 模式)
核心概念
- Lambda 是**可傳遞的小函數**(行為參數化)
- 集合內部迭代(
forEach、stream())替代外部手動迭代,支援並行
語法速覽
// 無參無返回
() -> System.out.println("Hello")
// 單參數,隱式返回
(String s) -> s.length()
// 或
s -> s.length()
// 多參數,代碼塊,顯式返回
(int a, int b) -> { return a + b; }
// 方法引用:類::靜態方法、對象::實例方法、類::實例方法、構造器引用
String::valueOf
System.out::println
String::compareToIgnoreCase
ArrayList::new
函數式介面
Lambda 只能賦值給**單一抽象方法(SAM)**的介面。JDK 8 提供豐富內置函數式介面(java.util.function):
| 介面 | 參數 | 返回 | 用途 |
| Predicate<T> | T | boolean | 過濾判斷 |
| Function<T,R> | T | R | 轉換映射 |
| Consumer<T> | T | void | 消費處理 |
| Supplier<T> | 無 | T | 供給生成 |
| UnaryOperator<T> | T | T | 一元運算 |
| BinaryOperator<T> | T,T | T | 二元運算 |
實戰:從匿名類到 Lambda
FileFilter 過濾目錄
// 匿名內部類 (Java 7)
FileFilter filter = new FileFilter() {
public boolean accept(File f) { return f.isDirectory(); }
};
// Lambda (Java 8)
FileFilter filter = (File f) -> f.isDirectory();
// 類型推導進一步簡化
FileFilter filter = f -> f.isDirectory();
Stream API 三大核心模式
List list = Arrays.asList("a", "bb", "ccc", "dddd");
// 1. Filter (過濾)
list.stream().filter(s -> s.length() > 2).forEach(System.out::println);
// 2. Map (映射/轉換)
list.stream().map(String::toUpperCase).forEach(System.out::println);
// 3. Reduce (化簡/聚合)
int totalLen = list.stream().mapToInt(String::length).sum();
// 或
String concat = list.stream().reduce("", (a, b) -> a + b);
並行流:一鍵啟用多核
// 串行
list.stream().filter(...).map(...).forEach(...);
// 並行(自動利用所有 CPU 核心)
list.parallelStream().filter(...).map(...).forEach(...);
無需手動管理線程池、分割任務、合併結果,框架自動完成。
變量捕獲規則
- Lambda 只能捕獲 **final 或 effectively final** 的局部變量(不可在 Lambda 中修改外部局部變量)
- 實例變量、靜態變量無此限制
默認方法:介面演進的關鍵
JDK 8 允許介面定義 default 方法,使 Collection 等舊介面可平滑添加 stream()、forEach() 等方法而不破壞現有實現類。
總結
Lambda + Stream API 徹底改變了 Java 集合處理方式:聲明式、可組合、可並行。掌握函數式介面、方法引用、三大核心模式、並行流、變量捕獲規則,即可編寫現代、高效、可維護的 Java 代碼。
- 上一篇文章: Java 中 Hashtable 與 HashMap 詳細差異對比
- 下一篇文章: JVM 線程堆棧分析實戰指南:從入門到專家
Copyright ©
程式碼之家 All Rights Reserved