flatmap 扁平化嵌套集合需逐层调用,每层将元素转为 stream 后自动合并;处理 list 时用 flatmap(list -> list.stream()),防 null 需 filter;二维数组用 arrays.stream().flatmap(stream::of);多层嵌套需多次 flatmap;对象属性嵌套需防护 null 并流化。

用 flatMap 扁平化嵌套集合,关键是“每层嵌套调一次 flatMap”,它把每个元素转成一个 Stream,再自动合并所有子流——不是靠循环,也不是靠递归,而是靠类型匹配和链式展开。
处理 List> 转为 List
这是最常见场景。核心是:外层流化后,对每个子 List 调用 .stream(),再由 flatMap 合并。
- 必须用
flatMap(list -> list.stream()),不能写map(list -> list.stream()),否则得到的是Stream<stream>></stream>,后续操作会编译失败 - 若子列表可能为
null,加.filter(Objects::nonNull)防止空指针 - 示例:
Listflat = nested.stream()
.filter(Objects::nonNull)
.flatMap(list -> list.stream())
.collect(Collectors.toList());
处理二维数组(如 String[][])
数组不能直接调用 stream(),得借助 Arrays.stream() 或 Stream::of。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 用
Arrays.stream(data).flatMap(Stream::of):Stream::of专用于将数组转为流 - 等价写法:
Arrays.stream(data).flatMap(Arrays::stream),效果一样,但语义更明确 - 注意:如果数组元素本身是
null,Stream::of会保留null元素,需额外过滤
处理多层嵌套(如 List>>)
flatMap 每次只降一维,三层嵌套就得两次 flatMap 才能到 Stream<string></string>。
- 第一层:
.flatMap(list2d -> list2d.stream())→ 得到Stream<list>></list> - 第二层:
.flatMap(list1d -> list1d.stream())→ 得到Stream<string></string> - 超过三层时代码易读性下降,建议检查数据建模是否合理,或提前用 DTO 展平部分结构
处理对象嵌套属性(如 User → List → city)
从对象字段中提取嵌套集合,关键在 getter 返回值的防护与流化时机。
- 写法:
users.stream().flatMap(u -> u.getAddresses().stream()) - 如果
getAddresses()可能返回null,改用:u -> Optional.ofNullable(u.getAddresses()).orElse(List.of()).stream() - 之后可接
.map(Address::getCity)、.distinct()等操作,最后收集
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










