方法引用是 Lambda 表達式的緊湊形式,使用 :: 操作符引用已存在的方法,使代碼更易讀。本文系統講解方法引用的四種類型、語法糖本質、適用與不適用場景,並附完整代碼演示。
當 Lambda 表達式僅調用一個現有方法而無額外邏輯時,可用方法引用替代。例如:
(a, b) -> Person.compareByAge(a, b) // Lambda
Person::compareByAge // 方法引用,語義等價
ClassName::staticMethodName
// 例:Person::compareByAge
instance::instanceMethodName
// 例:myComparisonProvider::compareByName
ClassName::instanceMethodName
// 例:String::compareToIgnoreCase
// 實際調用時,第一個參數作為方法調用者,其餘作為參數傳遞
ClassName::new
// 例:HashSet<Person>::new
// 配合函數式接口 Supplier<T> 使用
// Person 類定義(含靜態比較方法 compareByAge)
// 原始寫法:實現 Comparator 接口
Arrays.sort(pArr, new PersonAgeComparator());
// 改進一:Lambda 表達式
Arrays.sort(pArr, (a, b) -> a.getBirthday().compareTo(b.getBirthday()));
// 改進二:Lambda 調用現有靜態方法
Arrays.sort(pArr, (a, b) -> Person.compareByAge(a, b));
// 改進三:方法引用(最簡潔)
Arrays.sort(pArr, Person::compareByAge);
| 場景 | 建議 | 示例 |
|---|---|---|
| Lambda 僅調用現有方法 | ✅ 使用方法引用 | list.forEach(System.out::println) |
| 需傳遞額外參數/組合邏輯 | ❌ 保持 Lambda | () -> ReferenceDemo.commonMethod("arg") |
| 構造對象/集合 | ✅ 使用構造引用 | HashSet::new |
| 實例方法需特定上下文 | ✅ 使用實例引用 | obj::method |
方法引用本質是 Lambda 的語法糖,編譯後字節碼一致。掌握四種類型並識別適用場景,能顯著提升函數式編程代碼的可讀性與表達力。