java中用lambda处理嵌套集合的核心是stream+flatmap展平层级,再通过filter、map、collect等操作精准提取或转换;flatmap将每个元素映射为stream后压平成单一流,需注意null校验。

Java 中用 Lambda 处理嵌套集合,核心是靠 Stream + flatMap 拆开层级,再结合 filter、map、collect 等操作精准取值或转换。它不是“一层层写 for 循环”,而是把嵌套结构当成可展开的流来处理。
用 flatMap 展平嵌套 List
当外层是 List<list>></list> 或 List<parent></parent> 且 Parent 有 List<child></child> 字段时,flatMap 是关键。
-
flatMap接收一个函数,该函数返回Stream>;它会把每个元素映射成一个流,再把所有流“压平”成单一流 - 常见写法:
.flatMap(list -> list.stream())(对 List- >),或
.flatMap(parent -> parent.getChildren().stream())(对对象字段) - 注意:如果子集合可能为 null,需提前判空,否则抛
NullPointerException
从嵌套对象中提取特定字段
比如有个 List<department></department>,每个 Department 有 List<employee></employee>,你想拿到所有员工姓名:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 先 flatMap 到员工层:
depts.stream().flatMap(d -> d.getEmployees().stream()) - 再 map 提取字段:
.map(Employee::getName) - 最后 collect:
.collect(Collectors.toList()) - 完整链式:
depts.stream().flatMap(d -> d.getEmployees().stream()).map(Employee::getName).collect(Collectors.toList())
带条件筛选的嵌套遍历
想只取年龄大于 25 的员工姓名?在 flatMap 后插入 filter 即可:
depts.stream().flatMap(d -> d.getEmployees().stream()).filter(e -> e.getAge() > 25).map(Employee::getName).collect(Collectors.toList())
处理 Map 嵌套结构
如果是 Map<string map object>></string> 这类双层 Map,不建议硬套 flatMap,更适合用双重 forEach:
- 外层参数是
(key, innerMap),内层对innerMap调用forEach((k, v) -> {...}) - 务必检查
innerMap != null,避免空指针 - 若需收集结果(如所有 value 的字符串列表),再转 Stream:
outerMap.values().stream().filter(Objects::nonNull).flatMap(m -> m.values().stream()).map(Object::toString).collect(...)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










