简短结论:大部分情况下可以替代,但不是 100% 能替代。
下面分情况说明。
只要匿名类实现的是一个函数式接口(只有一个抽象方法的接口),就可以用 Lambda 替代。
匿名类写法:
Runnable r = new Runnable() {
@Override
public void run() {
System.out.println("run");
}
};
Lambda 写法:
Runnable r = () -> System.out.println("run");
常见可替代场景:
RunnableComparatorCallableActionListenerLambda 去掉了:
new 接口名@Overrideinterface A {
void m1();
void m2();
}
✅ 匿名类可以
❌ Lambda 不行
例如:
new Object() {
@Override
public String toString() {
return "abc";
}
};
Lambda 无法实现。
匿名类可以:
new Runnable() {
int count = 0;
public void run() {
count++;
}
};
Lambda 只能是一个方法体。
this:指向匿名类对象this:指向外部类class Test {
void m() {
Runnable r1 = new Runnable() {
public void run() {
System.out.println(this); // 匿名类对象
}
};
Runnable r2 = () -> System.out.println(this); // Test 对象
}
}
| 场景 | 匿名类 | Lambda |
|---|---|---|
| 函数式接口 | ✅ | ✅ |
| 多抽象方法 | ✅ | ❌ |
| 重写 Object 方法 | ✅ | ❌ |
| 成员变量 | ✅ | ❌ |
| this 指向外部类 | ❌ | ✅ |
| 代码简洁 | ❌ | ✅ |
✅ 结论:
Lambda 是匿名类的“简化版”,但只在函数式接口场景下可以完全替代。
如果你愿意,我可以给你一份**“匿名类 vs Lambda 改写对照清单”**。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。