map是一对一映射,flatmap是一对多映射并扁平化合并;map接收function返回单个值,流层级和元素数量不变;flatmap接收function返回流,再合并为单层流,适用于拆分、展开嵌套结构等场景。

本质区别在于:map 是一对一映射,flatMap 是一对多映射 + 扁平化合并。
map:每个元素变一个新元素
map 接收一个 Function
- 适合大小写转换、字段提取、类型转换等简单操作
- 例如:
list.stream().map(s -> s.length())→ 每个字符串变成一个整数,结果流长度和原列表一致 - 不能处理返回集合或 Stream 的函数;若强行用 map 返回 List,结果会是
Stream<list>></list>,嵌套结构仍在
flatMap:每个元素变一个流,再压成一层
flatMap 接收一个 Function
- 核心动作是“映射 + 扁平化”,消除嵌套层级
- 典型场景:拆分字符串为字符、展开嵌套列表、链式处理 Optional、过滤并展开空值
- 例如:
list.stream().flatMap(s -> s.chars().mapToObj(c -> (char)c))→ 把每个字符串转成字符流,最终得到所有字符的一维流 - 返回 null 相当于生成空流,该元素被跳过(安全地实现“过滤+展开”)
关键差异看签名和行为
从方法定义就能看出根本不同:
<r> Stream<r> map(Function super T, ? extends R> mapper)</r></r><r> Stream<r> flatMap(Function super T, ? extends Stream extends R>> mapper)</r></r>
flatMap 的 mapper 必须返回 Stream,而 map 的 mapper 返回普通对象。JVM 会自动把 flatMap 中每个子流连接起来,这是它独有的能力。
选哪个?看你要不要“拆层”
判断逻辑很简单:
- 输入一个元素,你想得到一个结果 → 用 map
- 输入一个元素,你想得到零个、一个或多个结果,并且希望它们和其他元素的结果混在一起 → 用 flatMap
- 看到 List
- > 或 Optional
或 String.chars() 这类结构 → 基本都要 flatMap
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











