Lambda表达式用于简洁替代单抽象方法的函数式接口实现,前提是接口仅含一个抽象方法,语法为(参数)->{方法体},可省略类型、括号、大括号和return;典型应用如Thread和Comparator;不可访问非final局部变量,无独立this,不支持未声明的受检异常。

Java 中 Lambda 表达式的核心作用,就是用更简洁的语法替代只实现一个抽象方法的匿名内部类(即函数式接口的实例),从而让代码更紧凑、可读性更高。
前提:必须是函数式接口
只有**只有一个抽象方法**的接口才能使用 Lambda 表达式。Java 自带的如 Runnable、Comparator、Consumer、Function 等都是函数式接口(有 @FunctionalInterface 注解)。如果不是函数式接口,编译直接报错。
基本语法结构
Lambda 表达式写法为:(参数列表) -> { 方法体 },可进一步简化:
- 参数类型通常可省略(编译器能推断),如
(a, b) -> a + b - 只有一个参数时括号可省,如
a -> a.length() - 方法体只有一条语句且为返回值时,大括号和 return 都可省,如
s -> s.toUpperCase() - 方法体有多条语句,必须加 {} 和 return(如需返回)
典型场景对比:从匿名内部类到 Lambda
示例 1:启动线程
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
匿名内部类写法:
new Thread(new Runnable() {@Override
public void run() {
System.out.println("Hello");
}
});
Lambda 写法:
new Thread(() -> System.out.println("Hello"));示例 2:集合排序
匿名内部类写法:
list.sort(new Comparator@Override
public int compare(String s1, String s2) {
return s1.length() - s2.length();
}
});
Lambda 写法:
list.sort((s1, s2) -> s1.length() - s2.length());注意事项与常见误区
- Lambda 不能访问其所在作用域中非 final 或“事实 final”(未被修改)的局部变量
- Lambda 没有自己的 this,它内部的 this 指向的是外部类实例
- 不要试图在 Lambda 中抛出受检异常(Exception),除非函数式接口的方法声明了该异常
- 过度嵌套或逻辑复杂的 Lambda 建议提取成普通方法,保持可读性

















