简短结论:大部分情况下可以,但不是 100% 能替代。
下面分情况说明。
只要匿名类实现的是函数式接口(只有一个抽象方法),就可以用 Lambda 替代。
// 匿名类
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("run");
}
}).start();
// Lambda
new Thread(() -> System.out.println("run")).start();
常见可替代接口:
RunnableCallableComparatorFunction / Predicate / Consumer@FunctionalInterface)✅ 这是 Lambda 的主要用途
Lambda 去掉了:
new@Overrideinterface A {
void m1();
void m2();
}
❌ 不能用 Lambda
✅ 必须用匿名类
this 指向“当前匿名类本身”Lambda 中的 this:
this 指向匿名类对象// 匿名类
new Runnable() {
public void run() {
System.out.println(this); // 匿名类对象
}
}
// Lambda
Runnable r = () -> {
System.out.println(this); // 外部类对象
};
⚠️ 如果有状态或自引用,匿名类更安全
Lambda 不能:
匿名类可以:
new Object() {
int count = 0;
void inc() { count++; }
};
Lambda 没有构造函数
abstract class A {
abstract void m();
}
❌ Lambda 不行
✅ 匿名类可以
| 场景 | 匿名类 | Lambda |
|---|---|---|
| 函数式接口 | ✅ | ✅ |
| 多方法接口 | ✅ | ❌ |
| 抽象类 | ✅ | ❌ |
| 有状态/字段 | ✅ | ❌ |
| this 语义 | 自身 | 外部类 |
| 代码简洁 | ❌ | ✅ |
Lambda 是“函数式接口版匿名类”的语法糖,不是匿名类的完全替代。
如果你愿意,我也可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。