lambda表达式用于简化函数式接口(仅含一个抽象方法)的匿名内部类写法,如runnable、comparator等;不可用于多抽象方法接口或普通/抽象类的匿名子类;支持参数与返回值的多种简化形式,并要求访问的局部变量为effectively final。

Java 中 Lambda 表达式主要用来简化**只含一个抽象方法的接口(即函数式接口)**的匿名内部类写法,核心是省去冗余语法,聚焦业务逻辑。
前提:必须是函数式接口
Lambda 只能替代实现了函数式接口的匿名内部类。比如 Runnable、Comparator、Consumer、Function 等——它们只有一个抽象方法(允许有默认方法或静态方法)。
- 接口里有多个抽象方法?不能直接用 Lambda,得先改造成函数式接口,或用其他方式
- 普通类或抽象类的匿名子类?Lambda 不适用,只能用传统匿名类或新写个实现类
简化步骤:从匿名类到 Lambda
以 Runnable 为例对比:
// 匿名内部类写法(啰嗦)
new Runnable() {<br>
@Override<br>
public void run() {<br>
System.out.println("Hello");<br>
}<br>
};
// Lambda 写法(简洁)() -> System.out.println("Hello")
- 省掉
new Runnable()和@Override声明 - 省掉方法名
run和参数类型(编译器根据函数式接口推断) - 如果方法体只有一句,可省大括号和
return(有返回值时需确保类型匹配)
参数和返回值的常见简化形式
根据接口抽象方法的参数个数和返回情况,Lambda 写法灵活变化:
- 无参无返回:
() -> doSomething() - 单参可省括号:
s -> s.length() > 0(等价于(s) -> s.length() > 0) - 多参必须括号:
(x, y) -> x + y - 多语句需大括号+return:
(a, b) -> { int sum = a + b; return sum > 10; }
注意变量访问限制
Lambda 内部可以访问外部的局部变量,但该变量必须是 实际上的 final(effectively final)——即定义后未被重新赋值。
- ✅ 允许:
int x = 10; list.forEach(i -> System.out.println(x)); - ❌ 编译报错:
int x = 10; x = 20; list.forEach(i -> System.out.println(x)); - 实例字段、静态字段无此限制,可自由读写
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











