Lambda表达式核心是简化函数式接口(仅一个抽象方法)的实现,替代匿名内部类;必须满足@FunctionalInterface约束,常见如Runnable、Consumer等;语法为(参数)->{逻辑},支持多级简化。

Java 中 Lambda 表达式替代传统接口实现,核心是用简洁语法直接提供函数式接口的实例,跳过写实现类或匿名内部类的步骤。前提是该接口必须是函数式接口——即只有一个抽象方法。
确认接口是否支持 Lambda
只有带 @FunctionalInterface 注解、且仅含一个抽象方法的接口才能用 Lambda 实现。常见 JDK 接口如 Runnable、Comparator、Consumer、Predicate、Function 都符合要求。
- 检查接口源码:看是否只有 1 个未实现的抽象方法(默认方法、静态方法不影响)
- IDE(如 IntelliJ)会在 new 接口处提示 “Can be replaced with lambda”
- 自定义接口加 @FunctionalInterface 后,编译器会强制校验单抽象方法约束
从匿名内部类到 Lambda 的三步替换
以 Runnable 为例,传统写法需 5 行;Lambda 一行搞定:
- 参数列表 → 看接口方法的形参:无参写 (),单参可省括号如 x,多参写 (a, b)
- 箭头符号 → 固定用 -> 分隔参数与逻辑
- 方法体 → 单条语句省略花括号和分号;多条语句用 {} 包裹,并显式 return(如有返回值)
常见接口的 Lambda 写法示例
不同场景下写法略有差异,但逻辑一致:
立即学习“Java免费学习笔记(深入)”;
-
Runnable(无参无返回):
() -> System.out.println("done") -
Comparator(双参有返回):
(s1, s2) -> s1.length() - s2.length() -
Predicate(单参返回 boolean):
s -> s != null && !s.trim().isEmpty() -
Consumer(单参无返回):
System.out::println(方法引用,也是 Lambda 的一种形式)
不能用 Lambda 替代的情况
不是所有接口实现都能被替换,遇到以下情形需保留匿名类或改用其他方式:
- 接口有多个抽象方法(如自定义接口里写了
void save(); void update();) - 需要在实现中定义新字段、新方法,或使用
this指向当前匿名实例 - 需访问非 final 的局部变量(Lambda 只能捕获 effectively final 的变量)
- 逻辑复杂、多层嵌套判断,强行用 Lambda 反而降低可读性


















