核心是将每个子List转为Stream再合并:nested.stream().flatMap(List::stream).collect(Collectors.toList());需防null时加.filter(Objects::nonNull),区别于map在于flatMap自动扁平化而非生成嵌套流。

用 flatMap 把二维 List<list>></list> 转成一维 List<t></t>,核心是把每个子列表“展开”为流,再合并所有流。
理解 flatMap 的作用
flatMap 接收一个函数,该函数对每个元素返回一个 Stream,然后自动把所有子流“扁平化”合并成一个流。这正好对应“把每个内层 List 变成 Stream,再合起来”的需求。
基本写法(推荐)
假设你有一个 List<list>></list>:
// 示例数据
立即学习“Java免费学习笔记(深入)”;
List<List<String>> nested = Arrays.asList(
Arrays.asList("a", "b"),
Arrays.asList("c"),
Arrays.asList("d", "e", "f")
);
// 压平成一维 List
List<String> flat = nested.stream()
.flatMap(list -> list.stream()) // 每个 List → Stream<String>
.collect(Collectors.toList());
结果:
["a", "b", "c", "d", "e", "f"]</p> <H3>常见变体写法</H3> <ul> <li>用方法引用更简洁:<code>.flatMap(List::stream)
List<string></string>),改用 Arrays::stream
null 的子列表时,加空值检查:.filter(Objects::nonNull).flatMap(...)
flatMap 后链式调用:.distinct() 或 .sorted()
为什么不用 map + collect?
map 会把每个 List 变成一个 Stream,结果是 Stream<stream>></stream>,没法直接收集;而 flatMap 内部做了合并,一步到位。这是它和 map 的本质区别。


















