flatmap核心是将每个元素转为流再合并,专用于“一个变多个+扁平化”,需返回stream、防null、逐层解包多级嵌套,支持list、对象集合、map等结构的扁平处理。

Java 中用 flatMap 处理嵌套集合,核心就一条:把每个元素变成一个流,再把所有子流“拍平”成一个流。它不是简单转换,而是专为“一个变多个 + 合并”设计的操作。
扁平化二维列表(List> → List)
这是最典型的场景。比如你有一组字符串列表,想合并成单个字符串列表:
- 必须对每个子列表调用
.stream(),生成Stream<string></string> - 不能直接返回
List或T,否则编译报错——flatMap要求函数返回Stream extends R> - 空子列表会触发
NullPointerException,建议先.filter(Objects::nonNull)
示例代码:
List<string> flat = nested.stream()<br> .filter(Objects::nonNull)<br> .flatMap(list -> list.stream())<br> .collect(Collectors.toList());</string>
处理对象中的嵌套集合(如 Student → List)
当实体类字段本身是集合时,flatMap 可自然提取深层数据:
- 先用
stream()遍历外层对象流 - 对每个对象,调用其集合 getter 并转为流,传入
flatMap - 后续可接
map、distinct、filter等操作,链式表达力强
例如提取所有不重复的课程名:
Set<string> courses = students.stream()<br> .flatMap(s -> s.getCourses().stream())<br> .distinct()<br> .collect(Collectors.toSet());</string>
多层嵌套结构(如 School → Class → Student → Course)
每层嵌套对应一次 flatMap,逐级“解包”,不能一步到位:
- 第一层
flatMap展开 School 到 Class 流 - 第二层展开 Class 到 Student 流
- 第三层展开 Student 到 Course 流
- 之后才能统一映射或聚合,比如求所有课程学分总和
关键点:中间任何一层漏掉 flatMap,类型就会卡在 Stream<stream>></stream>,后续操作无法进行。
合并嵌套 Map(Map> → Map)
外层 Map 的每个 value 是内层 Map,目标是合并所有键值对:
- 用
.values().stream()获取所有内层 Map 的流 - 用
flatMap把每个内层 Map 转为entrySet().stream() - 最后用
Collectors.toMap()收集,遇到重复 key 时需指定合并函数
无冲突场景:
Map<string string> merged = outerMap.values().stream()<br> .flatMap(map -> map.entrySet().stream())<br> .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));</string>
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











