lambda表达式本质是函数式接口的简洁实现方式,仅适用于有且仅有一个抽象方法的接口(如runnable、comparator),通过省略new、方法声明等模板代码,以“参数→动作”形式重构,支持类型推断与多语句块处理。

Java 中 Lambda 表达式本质是函数式接口的简洁实现方式,它能大幅简化只有一处抽象方法的匿名内部类写法,前提是该接口满足“函数式接口”定义(有且仅有一个抽象方法)。
前提:必须是函数式接口
只有接口中**只有一个抽象方法**(可以有 default 或 static 方法),才能用 Lambda 替代。比如 Runnable、Comparator、Consumer、Function 等都是标准函数式接口。
如果自己定义接口,需加上 @FunctionalInterface 注解,编译器会检查是否符合要求。
基本替换规则
把匿名内部类中重写的那个方法体,抽出来作为 Lambda 主体;参数列表和返回值类型由接口方法签名自动推断。
- 省去
new 接口名() { ... }和public void method(...) { ... }这类模板代码 - 参数类型通常可省略(编译器能推断),但多个参数或类型不明确时建议保留
- 方法体只有一条语句时,可省略花括号和
return关键字 - 方法体有多条语句,必须加花括号,并显式写
return(若需要返回值)
常见场景对比示例
启动线程(Runnable):
匿名内部类写法:
new Thread(new Runnable() {@Override
public void run() {
System.out.println("Hello");
}
}).start();
Lambda 写法:
排序(Comparator):
匿名内部类写法:
Arrays.sort(arr, new Comparator@Override
public int compare(Integer a, Integer b) {
return b - a;
}
});
Lambda 写法:
Arrays.sort(arr, (a, b) -> b - a);集合遍历(Consumer):
list.forEach(new Consumer@Override
public void accept(String s) {
System.out.println(s.toUpperCase());
}
});
Lambda 写法:
list.forEach(s -> System.out.println(s.toUpperCase()));注意作用域与 this 的变化
Lambda 表达式中访问的局部变量必须是 有效 final(即事实上不可修改),不像匿名内部类那样隐式复制一份副本;
Lambda 中的 this 指向的是**外部类实例**,不是某个新对象 —— 它没有独立的运行时对象,而匿名内部类有自己的实例。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











