Java Lambda 表达式是函数式接口(仅含一个抽象方法)的简洁实现,可替代对应匿名内部类,省略new、方法声明和参数类型;但不适用于多抽象方法接口、需定义字段/构造器或依赖this指向差异的场景。

Java Lambda 表达式本质上是函数式接口的简洁实现方式,它能直接替代**只含一个抽象方法**的匿名内部类,大幅减少模板代码。
前提:必须是函数式接口
只有接口中**仅有一个抽象方法**(允许有默认方法、静态方法或重载的 Object 方法),才能用 Lambda 替代。例如:
-
✅ 可以:
Runnable、Comparator、Function、自定义的@FunctionalInterface interface Action { void run(); } -
❌ 不可以:普通类、抽象类、含两个以上抽象方法的接口(如
List或自定义双抽象方法接口)
语法替换:从匿名类到 Lambda 的三步简化
以 Runnable 为例:
// 匿名内部类写法(冗长)
new Runnable() {
@Override
public void run() {
System.out.println("Hello");
}
};
<p>// Lambda 写法(简洁)
() -> System.out.println("Hello");
</p>
简化逻辑:
- 省略
new Xxx()和implements/extends声明 - 省略方法名和修饰符(
public void run→ 隐含匹配接口唯一方法) - 参数类型可推断时省略(如
Comparator的(s1, s2) -> s1.length() - s2.length(),无需写String s1, String s2)
常见场景对照示例
1. 线程任务
new Thread(new Runnable() {
public void run() { doWork(); }
}).start();
<p>// → 简化为
new Thread(() -> doWork()).start();
</p>
2. 事件监听(Swing/AWT)
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("Clicked!");
}
});
<p>// → 简化为
button.addActionListener(e -> System.out.println("Clicked!"));
// 参数类型 e 自动推断为 ActionEvent,单参数时小括号可省略
</p>
3. 集合排序
list.sort(new Comparator<person>() {
public int compare(Person a, Person b) {
return a.getAge() - b.getAge();
}
});
<p>// → 简化为
list.sort((a, b) -> a.getAge() - b.getAge());
// 多参数必须加括号,返回值自动推断,无 return 关键字(单表达式时)
</p></person>
注意边界情况
Lambda 不能完全取代所有匿名内部类:
- 需要访问
this指向外部类实例时,Lambda 中的this是外部类对象;而匿名类中this是其自身实例 —— 若逻辑依赖该区别,不能替换 - 需要在匿名类中定义字段、构造器、多个方法或使用
super调用父类方法时,Lambda 无法支持 - 异常类型检查:若接口方法声明抛出受检异常,Lambda 体也必须处理或声明相同异常
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











