✅ Lambda vs 匿名类对照速查表

使用场景Java 8+ LambdaJava 7 匿名内部类说明
无参接口() -> {...}new Xxx() { void m(){} }Runnable / Callable
单参x -> expr匿名类 accept(x)Consumer
多参(a,b) -> expr匿名类 compare(a,b)Comparator
返回值x -> x*2apply(x)Function
布尔判断x -> x>0test(x)Predicate
代码块{ ...; }方法体多行逻辑
方法引用Class::method手动调用可读性强
构造引用Class::newnew Class()Supplier
线程new Thread(()->{})new Runnable(){}最常见
线程池exec.submit(()->{})匿名类异步任务
集合遍历list.forEach(x->{})for 循环Stream
过滤filter(x->cond)if 判断Stream
转换map(x->y)for + addStream
排序sorted((a,b)->{})ComparatorList
聚合reduce(0,(a,b)->a+b)for 累加Stream
OptionalorElseGet(()->x)匿名类延迟执行
Spring Bean() -> new Obj()匿名类FactoryBean
事件监听e -> handle(e)监听器GUI / Web

🔥 高频对照示例(重点记这些)

1️⃣ Runnable(面试必考)

Lambda

new Thread(() -> System.out.println("run")).start();

匿名类

new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("run");
    }
}).start();

2️⃣ Comparator(排序)

Lambda

list.sort((a, b) -> a.length() - b.length());

匿名类

list.sort(new Comparator<String>() {
    @Override
    public int compare(String a, String b) {
        return a.length() - b.length();
    }
});

3️⃣ Consumer(forEach)

Lambda

list.forEach(x -> System.out.println(x));

匿名类

Consumer<String> c = new Consumer<String>() {
    @Override
    public void accept(String x) {
        System.out.println(x);
    }
};
list.forEach(c);

4️⃣ Function(转换)

Lambda

Function<String, Integer> f = s -> s.length();

匿名类

Function<String, Integer> f = new Function<String, Integer>() {
    @Override
    public Integer apply(String s) {
        return s.length();
    }
};

5️⃣ Predicate(过滤)

Lambda

list.stream().filter(x -> x > 0);

匿名类

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:

  • 复杂业务
  • 多层嵌套
  • 需要复用的方法
  • 需要断点调试的核心逻辑

更多推荐