java lambda表达式

✅ 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:

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

相关推荐
西瓜太郎12342 分钟前
request_id 如何串起请求、路由、计费和日志
后端·python
troy1283 分钟前
Python 基础语法(一):变量、数据类型与运算符
java·服务器·python
wuyk55510 分钟前
18.Kruskal 算法:用最短的边连成一张网
开发语言·算法·图论
Evand J10 分钟前
【MATLAB例程,图像降噪7】高斯加权滑动窗口滤波,用于图像降噪,带质量评价,附代码下载链接
开发语言·图像处理·matlab·滑动窗口·滤波·降噪·图像滤波
还是奇怪12 分钟前
OpenAI GPT-5.6 构建指南拆解:创业公司如何用模型选择与 Responses API 降低 Agent 成本
java·数据库·人工智能·gpt
可涵不会debug13 分钟前
LangChain 文本分割器详解:字符分割、Token 分割、硬约束递归分割实战
java·前端·数据库
sbjdhjd17 分钟前
ThinkPHP 5.0.10 缓存写入型 RCE 复盘:从手动搭建、换行绕过到源码单步验证 | 05
java·后端·安全·spring·网络安全·数据挖掘·php
用户2986985301419 分钟前
Python 将 Word 文档转换为图片的实践指南
后端·python·api
十年一梦惊觉醒20 分钟前
快手视频发布助手,全自动视频发布带货工具
开发语言·前端·javascript
弈栈录20 分钟前
LangChain Agent 实战:快速构建可调用工具的智能体
python·架构