flatMap可将List展平为单层Stream,核心是将每个内层列表转为Stream再合并;需过滤null/空列表以确保安全;还可逐层处理更深嵌套结构。
用 stream.flatmap() 把“列表的列表”(即 list<list>></list>)转成单层流,核心是把每个内层列表“展开”为一个流,再由 flatmap 合并所有子流。
理解 flatMap 的作用
flatMap 接收一个函数,该函数对每个元素返回一个 Stream;然后它自动把所有这些子流“压平”成一个新流。这和 map 不同——map 会产出 Stream<stream>></stream>,而 flatMap 直接产出 Stream<t></t>。
基本写法:用 stream() 展开每个子列表
对每个内层 List<t></t> 调用 .stream(),得到 Stream<t></t>,再交给 flatMap:
List<List<String>> listOfLists = Arrays.asList(
Arrays.asList("a", "b"),
Arrays.asList("c"),
Arrays.asList("d", "e", "f")
);
List<String> flattened = listOfLists.stream()
.flatMap(innerList -> innerList.stream())
.collect(Collectors.toList());
// 结果:["a", "b", "c", "d", "e", "f"]
处理空子列表或 null 元素(安全写法)
如果内层列表可能为 null 或为空,直接调用 stream() 会抛出异常。可提前过滤或提供默认空流:
- 跳过 null 子列表:
.filter(Objects::nonNull) - 跳过空子列表:
.filter(list -> !list.isEmpty()) - 更稳妥:用
Optional.ofNullable(...).orElse(Collections.emptyList()).stream()
List<List<Integer>> data = Arrays.asList(
Arrays.asList(1, 2),
null,
Arrays.asList(),
Arrays.asList(3)
);
List<Integer> safeFlat = data.stream()
.filter(Objects::nonNull)
.flatMap(list -> list.stream())
.collect(Collectors.toList());
// 结果:[1, 2, 3]
扩展:扁平化嵌套更深的结构(如 List>>)
只要中间某一层能转成 Stream,就可用 flatMap 拆一层。例如处理 List<optional>>></optional>:
- 先用
flatMap(opt -> opt.map(List::stream).orElse(Stream.empty())) - 或更清晰地分步:先
filter(Optional::isPresent),再map(Optional::get),最后flatMap(List::stream)


















