第一步:初学者代码 (没有 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
参数,执行这段代码”的核心思想。