Lambda表达式主要用于简化函数式接口(仅含一个抽象方法)的匿名内部类写法,如Runnable、Comparator等;语法为“参数→方法体”,支持类型推导与结构简化,但不适用于多抽象方法接口或需定义新成员的场景。

Java 中 Lambda 表达式主要用来简化函数式接口的匿名内部类写法,前提是该接口**有且仅有一个抽象方法**(即函数式接口)。只要满足这个条件,就能用 -> 语法替代原本冗长的 new Interface() { ... } 形式。
前提:必须是函数式接口
只有被 @FunctionalInterface 标注(或隐含满足)的接口才能用 Lambda。例如:
-
Runnable、Comparator、Consumer、Function等 JDK 自带接口 - 自己定义的接口,只要只有一个抽象方法(默认方法、静态方法不影响)
- 像
ActionListener这种 AWT/Swing 接口也适用(它只有一个actionPerformed方法)
基本语法对照
以 Runnable 为例:
传统匿名内部类写法:
立即学习“Java免费学习笔记(深入)”;
new Runnable() {
public void run() {
System.out.println("Hello");
}
};等价的 Lambda 写法:
() -> System.out.println("Hello");说明:
- 左边
()是参数列表,无参就写空括号 - 右边是方法体,单条语句可省略花括号和
return(有返回值时,表达式结果自动返回) - 如果有多条语句,需加花括号和显式
return(如有返回值)
带参数的常见例子
比如用 Comparator 排序字符串列表:
匿名内部类:
Collections.sort(list, new Comparator<String>() {
public int compare(String s1, String s2) {
return s1.length() - s2.length();
}
});Lambda 替代:
Collections.sort(list, (s1, s2) -> s1.length() - s2.length());
进一步简化(使用方法引用):
list.sort(Comparator.comparing(String::length));
注意:参数类型通常可由上下文推断,不用显式写 String s1, String s2;但若推断失败(如重载方法),可补全类型。
Lambda 不能替代的情况
以下情形仍需匿名内部类(或普通类):
- 接口有多个抽象方法(如早期的
WindowListener) - 需要调用接口中不存在的方法(比如访问
this、定义新字段或方法) - 需要在实例初始化块中执行逻辑
- 需要继承某个类并实现接口(Lambda 只能实现接口,不能继承类)


















