map是Stream API中用于一对一映射转换的中间操作,将每个元素按Function<T,R>规则转为新类型元素,生成数量不变的新流,常用于字符串处理、字段提取、数值运算等场景。

map 是 Stream API 中最常用的转换操作之一,作用是将流中的每个元素按指定规则映射为另一个元素,生成一个**类型可能不同但数量不变**的新流。
map 的基本用法
它接收一个 Function<T, R> 函数式接口作为参数,表示“从 T 类型输入 → R 类型输出”的一对一映射关系。调用后返回一个新的 Stream<R>。
- 原始流不会被修改,Stream 操作都是中间操作,返回新流
- 元素个数保持不变:1 个输入 → 1 个输出
- 常见场景:字符串转大写、对象取某个字段、数值乘以系数、类型转换等
常见转换示例
假设有一个整数列表:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 转成字符串:
numbers.stream().map(String::valueOf).collect(Collectors.toList())→ ["1", "2", "3", "4"] - 平方运算:
numbers.stream().map(x -> x * x).collect(Collectors.toList())→ [1, 4, 9, 16] - 处理对象:若有个
Person列表,想提取所有姓名:people.stream().map(Person::getName).collect(Collectors.toList())
注意 map 和 flatMap 的区别
map 是“一对一”,而 flatMap 是“一对多 + 扁平化”。比如把字符串列表转成字符流:
立即学习“Java免费学习笔记(深入)”;
-
list.stream().map(s -> s.split(""))得到的是Stream<String[]>(每项是个数组) -
list.stream().flatMap(s -> Arrays.stream(s.split("")))才能得到Stream<String>(所有字符铺平成单层流)
链式调用中合理使用 map
map 常和其他操作组合,比如先 filter 再 map,或 map 后再 sorted/collect:
List<String> names = people.stream().filter(p -> p.getAge() > 18)
.map(Person::getFullName)
.sorted()
.collect(Collectors.toList());
- 顺序很重要:filter 应在 map 前,避免对不需要的数据做无谓转换
- map 内部应尽量轻量,避免复杂逻辑或 I/O 操作(影响性能和可读性)
- 如果转换逻辑较重,建议抽成独立方法,提升可读性和复用性

















