flatmap的核心是“先映射为流,再自动合并”,专用于一对多关系的扁平化处理;与map的一对一映射不同,flatmap将每个元素转为stream并展平为单一流,如嵌套列表、对象集合或字符串拆分等场景。

Java Stream API 的扁平化核心在于 flatMap —— 它不是简单映射,而是“映射成流再自动合并”。只要结构存在“一对多”关系(比如一个对象含多个子项、一个 Map 含多个 Entry、一个字符串要拆成多个字符),就适合用 flatMap 拉平。
flatMap 与 map 的本质区别
map 是一对一:输入一个元素,输出一个新元素,流的层级不变;
flatMap 是一对多 + 合并:输入一个元素,输出一个 Stream,所有子 Stream 被拍平为单一流。
例如:
• list.stream().map(s -> s.split("")) 得到的是 Stream<string></string>,仍是嵌套结构;
• list.stream().flatMap(s -> Arrays.stream(s.split(""))) 得到的是 Stream<string></string>,真正展开了。
三层嵌套结构的一次性展平
嵌套 Map 的逐层解包
面对 List<c></c> → C.map: Map<string b></string> → B.map: Map<string a></string> → A.value 的结构:
• .flatMap(c -> c.getMap().values().stream()) 解出所有 B;
• .flatMap(b -> b.getMap().values().stream()) 解出所有 A;
• .mapToInt(A::getValue).sum() 提取并聚合数值;
关键点在于每层都用 .values().stream() 获取子集合流,flatMap 负责串联与展平,无需手动迭代或临时集合。
扁平化后的数据收集策略
展平之后,根据目标格式选择终端操作:
• 要列表:用 .collect(Collectors.toList());
• 要求和/计数:用 .mapToInt(...).sum() 或 .count();
• 要转 Map:用 .collect(Collectors.toMap(Entry::getKey, Entry::getValue, (v1, v2) -> v1)),第三个参数处理键冲突;
• 空值安全建议:在 flatMap 前加 .filter(Objects::nonNull),或对子集合做 Optional.ofNullable(...).orElse(Collections.emptyList()).stream() 防御。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











