lambda表达式本质是函数式接口的简洁实现方式,即仅含一个抽象方法的接口(如runnable、comparator)的匿名函数式实现,可替代冗余的匿名内部类,但不适用于多抽象方法接口或非接口类型。

Java 中 Lambda 表达式本质是函数式接口的简洁实现方式,它能大幅简化只含一个抽象方法的匿名内部类写法——前提是该类实现的接口是函数式接口(即有且仅有一个抽象方法)。
前提:必须是函数式接口
只有接口满足“只有一个抽象方法”(可以有 default 或 static 方法),才能用 Lambda 替代。例如:
- ✅ 可以:Runnable、Comparator、Predicate、Function、Consumer 等 JDK 自带函数式接口
-
❌ 不可以:自定义接口若含两个及以上抽象方法(如同时有
run()和stop()),Lambda 无法直接替代
简化步骤:从匿名内部类到 Lambda
以 Runnable 为例,对比写法:
- 传统匿名内部类:
new Runnable() {<br> public void run() {<br> System.out.println("Hello");<br> }<br>} - 简化为 Lambda:
() -> System.out.println("Hello")
→ 省去类声明、方法签名、return(无返回值时)、花括号(单语句可省)
参数和返回值的简化规则
Lambda 的形参类型、括号、大括号、return 都可按需省略:
- 无参数:用
(),不可省略(如() -> 42) - 单个参数:类型可省,括号可省(如
x -> x * 2等价于(Integer x) -> x * 2) - 多个参数:类型可省,但括号不能省(如
(a, b) -> a + b) - 单表达式返回值:自动返回,不用
return;多语句需用{}和return(如x -> { System.out.println(x); return x * 2; })
常见误用提醒
不是所有匿名内部类都能替换:
- 如果匿名类访问了外部类的非 final(或事实 final)局部变量,Lambda 同样要求该变量为 final 或等效 final —— 这是共享变量安全性的约束,不是语法限制
- 若匿名类中调用了自身其他方法(比如重写了多个方法,或在
run()里调用了私有辅助方法),Lambda 无法表达,只能保留匿名类 - 匿名内部类若继承了具体类(如
new Thread() { ... }),而非实现接口,则 Lambda 完全不适用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











