✅ Lambda vs 匿名类对照速查表
| 使用场景 | Java 8+ Lambda | Java 7 匿名内部类 | 说明 |
|---|---|---|---|
| 无参接口 | () -> {...} |
new Xxx() { void m(){} } |
Runnable / Callable |
| 单参 | x -> expr |
匿名类 accept(x) |
Consumer |
| 多参 | (a,b) -> expr |
匿名类 compare(a,b) |
Comparator |
| 返回值 | x -> x*2 |
apply(x) |
Function |
| 布尔判断 | x -> x>0 |
test(x) |
Predicate |
| 代码块 | { ...; } |
方法体 | 多行逻辑 |
| 方法引用 | Class::method |
手动调用 | 可读性强 |
| 构造引用 | Class::new |
new Class() |
Supplier |
| 线程 | new Thread(()->{}) |
new Runnable(){} |
最常见 |
| 线程池 | exec.submit(()->{}) |
匿名类 | 异步任务 |
| 集合遍历 | list.forEach(x->{}) |
for 循环 | Stream |
| 过滤 | filter(x->cond) |
if 判断 | Stream |
| 转换 | map(x->y) |
for + add | Stream |
| 排序 | sorted((a,b)->{}) |
Comparator | List |
| 聚合 | reduce(0,(a,b)->a+b) |
for 累加 | Stream |
| Optional | orElseGet(()->x) |
匿名类 | 延迟执行 |
| Spring Bean | () -> new Obj() |
匿名类 | FactoryBean |
| 事件监听 | e -> handle(e) |
监听器 | GUI / Web |
🔥 高频对照示例(重点记这些)
1️⃣ Runnable(面试必考)
Lambda
java
new Thread(() -> System.out.println("run")).start();
匿名类
java
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("run");
}
}).start();
2️⃣ Comparator(排序)
Lambda
java
list.sort((a, b) -> a.length() - b.length());
匿名类
java
list.sort(new Comparator<String>() {
@Override
public int compare(String a, String b) {
return a.length() - b.length();
}
});
3️⃣ Consumer(forEach)
Lambda
java
list.forEach(x -> System.out.println(x));
匿名类
java
Consumer<String> c = new Consumer<String>() {
@Override
public void accept(String x) {
System.out.println(x);
}
};
list.forEach(c);
4️⃣ Function(转换)
Lambda
java
Function<String, Integer> f = s -> s.length();
匿名类
java
Function<String, Integer> f = new Function<String, Integer>() {
@Override
public Integer apply(String s) {
return s.length();
}
};
5️⃣ Predicate(过滤)
Lambda
java
list.stream().filter(x -> x > 0);
匿名类
java
Predicate<Integer> p = new Predicate<Integer>() {
@Override
public boolean test(Integer x) {
return x > 0;
}
};
⚠️ Lambda 使用限制(面试常问)
| 限制 | 说明 |
|---|---|
| 只能用于函数式接口 | 只有一个抽象方法 |
| 不能访问非 final 局部变量 | 隐式 final |
| this 指向外层类 | 不是当前 Lambda |
| 调试不如普通方法 | 堆栈难读 |
| 复杂逻辑不建议 | 影响可读性 |
✅ 什么时候用 Lambda?什么时候不用?
✅ 用 Lambda:
- Stream API
- 简单回调
- 集合操作
- 一次性逻辑
❌ 不用 Lambda:
- 复杂业务
- 多层嵌套
- 需要复用的方法
- 需要断点调试的核心逻辑