flatmap是java stream api中用于一对多映射并扁平化为单一流的核心操作;它先将每个元素映射为一个流,再合并所有子流,适用于拆分字符串、展平嵌套集合及处理一对多对象关系。

Java Stream API 中的 flatMap 是处理嵌套结构、实现数据流合并的核心操作——它不是简单转换,而是“先映射成流,再拍平为单一流”。
flatMap 的本质:一对多 + 扁平化
与 map 的一对一转换不同,flatMap 针对的是“一个元素 → 多个元素”的场景。它分两步执行:
- 对每个输入元素,应用函数生成一个 Stream
(比如把字符串拆成字符流、把国家映射为城市流) - 自动将所有子流合并成一个 Stream
,消除嵌套层级
例如:List<list>> nested = [[1,2], [3], [4,5,6]]</list>,调用 nested.stream().flatMap(List::stream) 后,得到的是单一流 [1,2,3,4,5,6]。
典型应用场景与写法
以下是最常遇到的三类 flatMap 使用模式,代码简洁且可直接复用:
-
拆分字符串为单词或字符:
words.stream().flatMap(w -> Arrays.stream(w.split(" ")))或.flatMap(w -> w.chars().mapToObj(c -> (char)c)) -
展平嵌套集合:
listOfLists.stream().flatMap(List::stream)(适用于List<list>></list>、Set<set>></set>等) -
处理一对多对象关系:如 Country → List
,用 countries.stream().flatMap(c -> c.cities().stream())直接拿到所有 City 对象流
flatMap 与 map 的关键区别
错误写法常源于混淆二者语义:
- 用
map(s -> s.split(" "))得到的是Stream<string></string>—— 一个装着数组的流,无法直接遍历单词 - 用
flatMap(s -> Arrays.stream(s.split(" ")) )才真正产出Stream<string></string>—— 所有单词在一个平铺的流里 - 记住口诀:map 出一个,flatMap 出一串再压平
配合收集器完成实际任务
flatMap 本身是中间操作,通常需接终端操作收尾。常见组合:
- 转成列表:
.flatMap(...).collect(Collectors.toList()) - 去重并转集合:
.flatMap(...).distinct().collect(Collectors.toSet()) - 统计总数:
.flatMap(...).count() - 聚合求和:
.flatMap(...).mapToInt(City::population).sum()(如统计所有城市人口)
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











