Java 8 前,排序列表需寫匿名內部類實作 Comparator:
// 傳統寫法
list.sort(new Comparator() {
@Override
public int compare(User u1, User u2) {
return Integer.compare(u1.getAge(), u2.getAge());
}
});
// Lambda 寫法
list.sort((u1, u2) -> Integer.compare(u1.getAge(), u2.getAge()));
// 更簡潔:方法引用
list.sort(Comparator.comparingInt(User::getAge));
@FunctionalInterface 標註的介面有且僅有一個抽象方法(SAM)。Comparator、Runnable、Consumer、Function 等皆為函數式介面。
@FunctionalInterface
public interface Comparator {
int compare(T o1, T o2); // 唯一抽象方法
// 其他 default / static 方法不影響資格
}
invokedynamic 指令)。(參數) -> { 方法體 }。| 介面 | 抽象方法 | 用途 | 範例 |
|---|---|---|---|
| Predicate | boolean test(T t) | 條件判斷 | list.filter(u -> u.getAge() > 18) |
| Function | R apply(T t) | 轉換 | map(User::getName) |
| Consumer | void accept(T t) | 消費/副作用 | forEach(System.out::println) |
| Supplier | T get() | 供給/延遲初始化 | () -> new User() |
| Comparator | int compare(T o1, T o2) | 排序 | sort((a,b) -> a - b) |
| 類型 | 語法 | 等價 Lambda |
|---|---|---|
| 靜態方法 | Class::staticMethod | (args) -> Class.staticMethod(args) |
| 實例方法(特定物件) | obj::method | (args) -> obj.method(args) |
| 實例方法(任意物件) | Class::method | (obj, args) -> obj.method(args) |
| 建構子 | Class::new | (args) -> new Class(args) |
Lambda 讓 Java 擁有函數式編程能力,核心是 函數式介面 + 型別推論 + 語法糖。善用 Stream API、方法引用、標準函數式介面,能寫出更宣告式、可讀、可並行的現代化 Java 代碼。