lambda 表达式用于简化函数式接口(仅含一个抽象方法的接口)的匿名类写法,如 runnable、comparator 等;语法为“参数 → 方法体”,支持类型推导与结构简化;需满足接口为 sam 且变量为实际 final。

Java 中 Lambda 表达式主要用来简化**函数式接口**的匿名内部类写法,前提是该接口只有一个抽象方法(即 SAM 接口)。它不是万能的,不能替代任意匿名类,但对常见操作如排序、遍历、事件监听等能大幅减少样板代码。
前提:必须是函数式接口
只有只含一个抽象方法的接口才能用 Lambda。比如 Runnable、Comparator、Consumer、Function 等 JDK 自带接口,或你自己定义的带 @FunctionalInterface 注解的接口。
- 如果接口有多个抽象方法,编译直接报错,无法用 Lambda
- 默认方法(
default)和静态方法不影响函数式接口性质 - 建议显式加上
@FunctionalInterface,让编译器帮你检查
基本语法:参数 → 方法体
Lambda 的结构很直观:左边是参数列表,右边是具体逻辑。类型通常可省略(由上下文推断),括号和花括号在简单情况下也能省略。
- 无参:
() -> System.out.println("Hello") - 单参:
s -> s.length()(无需括号,类型自动推导) - 多参:
(x, y) -> x + y(必须加括号) - 多行逻辑:
(a, b) -> { return a > b ? a : b; }(必须加花括号和return)
典型场景对比:从匿名类到 Lambda
以启动线程和集合排序为例,感受简化效果:
-
Runnable:
匿名类写法:new Thread(new Runnable() { public void run() { System.out.println("run"); } });
Lambda 写法:new Thread(() -> System.out.println("run")); -
Comparator:
匿名类:list.sort(new Comparator<string>() { public int compare(String a, String b) { return a.length() - b.length(); } });</string>
Lambda:list.sort((a, b) -> a.length() - b.length());
注意事项:this 和变量捕获
Lambda 并不创建新对象,它共享外围作用域的 this,且只能访问“实际上的 final”变量(即未被修改的局部变量)。
- 在 Lambda 里用
this,指向的是外部类实例,不是某个匿名类实例 - 局部变量即使没写
final,只要没被重新赋值,Lambda 就能安全引用 - 不要试图在 Lambda 里修改外部局部变量,编译会失败
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











