第一步:初學者代碼 (沒有 Lambda 的“舊”方法)
假設我們有一個簡單的需求:執行一個耗時的計算(比如網絡請求),并在計算完成后,通過一個“回調”來通知我們結果。
1. 定義一個回調接口
這個接口只有一個方法,用來在任務完成時被調用。
// 定義一個計算完成的回調接口
interface OnCalculationCompleteListener {// 當計算完成時,會調用這個方法,并傳入結果void onComplete(int result);
}
2. 創建一個使用回調的方法
這個方法接收兩個數字和一個回調接口的實例。它會模擬一個耗時操作,然后在操作完成后調用回調。
class Calculator {// 模擬一個異步加法,完成后通過 listener 通知結果public void addAsync(int a, int b, OnCalculationCompleteListener listener) {System.out.println("開始計算...");// 模擬耗時操作,比如一個網絡請求new Thread(() -> {try {Thread.sleep(2000); // 暫停2秒int sum = a + b;// 計算完成,調用傳入的 listener 的 onComplete 方法listener.onComplete(sum);} catch (InterruptedException e) {e.printStackTrace();}}).start();}
}
3. 調用方法 (使用匿名內部類)
在沒有 Lambda 表達式的時代,我們通常會像下面這樣使用“匿名內部類”來實現接口。
public class Main {public static void main(String[] args) {Calculator calculator = new Calculator();// 調用異步加法,并傳入一個回調的實現calculator.addAsync(10, 5, new OnCalculationCompleteListener() {@Overridepublic void onComplete(int result) {// 這部分代碼會在2秒后執行System.out.println("計算完成!結果是: " + result);}});System.out.println("主線程繼續執行其他任務...");}
}
代碼解釋:
new OnCalculationCompleteListener() { ... }
這部分就是匿名內部類。- 我們為了使用
addAsync
方法,必須給它傳遞一個OnCalculationCompleteListener
的實例。 - 這個實例需要實現
onComplete
方法。這部分代碼就是我們希望在計算完成后執行的邏輯。 - 這種寫法很冗長,有很多模板化的代碼(比如
new ...()
,@Override
,public void onComplete(...)
),而我們真正關心的只有花括號{}
里的那一行代碼。
第二步:使用 Lambda 表達式改造
Lambda 表達式就是為了簡化上面這種冗長的寫法的。Java 編譯器知道 addAsync
方法需要一個 OnCalculationCompleteListener
,并且這個接口只有一個方法 onComplete(int result)
。所以,很多信息都可以省略。
使用 Lambda 的寫法如下:
public class Main {public static void main(String[] args) {Calculator calculator = new Calculator();// 使用 Lambda 表達式來傳遞回調calculator.addAsync(10, 5, (result) -> {System.out.println("Lambda 計算完成!結果是: " + result);});System.out.println("主線程繼續執行其他任務...");}
}
語法格式講解:
(result) -> { System.out.println("..."); }
(result)
:這對應于接口方法onComplete(int result)
的參數列表。因為編譯器知道上下文,所以參數類型int
都可以省略。->
:這是 Lambda 運算符,讀作 “goes to”,用來分隔參數和方法體。{ ... }
:這是方法體,也就是具體要執行的代碼。如果只有一行代碼,甚至可以省略花括號{}
。
你看,Lambda 表達式把一個復雜匿名類的實現,簡化成了一行清晰的代碼,完美地傳遞了“當任務完成后,帶著result
參數,執行這段代碼”的核心思想。