当前位置:首页 > Java > 正文

Java 扁平化流详解(使用 flatMap 实现 Stream 扁平化操作的完整教程)

在 Java 8 引入的 Stream API 中,扁平化流(Flattening Streams)是一个非常实用但初学者容易困惑的概念。本文将用通俗易懂的方式,手把手教你如何使用 flatMap 方法实现 Java 扁平化流,让你轻松掌握 Stream 扁平化 的核心技巧。

什么是“扁平化”?

想象一下,你有一个装满信封的盒子,每个信封里又有多张纸条。如果你直接把所有信封倒出来,得到的是一堆信封(每个信封还是一个整体)。而“扁平化”就是把每个信封都拆开,把里面的纸条全部拿出来,最终得到一叠纸条——这就是从“嵌套结构”变成“单一结构”的过程。

Java 扁平化流详解(使用 flatMap 实现 Stream 扁平化操作的完整教程) Java扁平化流 Stream扁平化 flatMap教程 Java8流操作 第1张

为什么需要 flatMap?

在处理集合的集合(比如 List<List<String>>)时,如果我们使用普通的 map 方法,结果仍然是嵌套结构。而 flatMap 能将多层结构“压平”成一层,便于后续操作如过滤、排序、收集等。

flatMap 基础语法

flatMap 接收一个函数,该函数将每个元素映射为一个 Stream,然后将这些子流合并成一个大的流。

<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)

实战示例:从 List<List<String>> 到 List<String>

假设我们有以下数据结构:

List<List<String>> nestedList = Arrays.asList( Arrays.asList("苹果", "香蕉"), Arrays.asList("橙子", "葡萄", "西瓜"), Arrays.asList("芒果") );

我们想把它变成一个包含所有水果的单一列表:["苹果", "香蕉", "橙子", "葡萄", "西瓜", "芒果"]

使用 flatMap 的代码如下:

List<String> flatList = nestedList.stream() .flatMap(List::stream) // 将每个 List<String> 转为 Stream<String>,然后合并 .collect(Collectors.toList()); System.out.println(flatList); // 输出: [苹果, 香蕉, 橙子, 葡萄, 西瓜, 芒果]

更复杂的例子:处理对象中的列表

假设我们有班级和学生的关系:

class Class { String className; List<String> students; // 构造函数、getter 省略 } List<Class> classes = Arrays.asList( new Class("一班", Arrays.asList("小明", "小红")), new Class("二班", Arrays.asList("小刚", "小丽", "小强")) );

我们想获取所有学生的姓名列表:

List<String> allStudents = classes.stream() .flatMap(c -> c.students.stream()) .collect(Collectors.toList()); System.out.println(allStudents); // 输出: [小明, 小红, 小刚, 小丽, 小强]

flatMap 与 map 的区别

- map:一对一转换,输入一个元素,输出一个元素(可能是不同类型的)。

- flatMap:一对多再压平,输入一个元素,输出一个流,然后将所有流合并成一个流。

总结

通过本教程,你应该已经掌握了 Java 扁平化流 的核心概念和使用方法。记住:flatMap 是处理嵌套集合的利器,尤其在结合其他 Java8流操作(如 filter、sorted、collect)时,能写出非常简洁高效的代码。

无论你是刚开始学习 Stream 扁平化,还是想巩固 flatMap教程 中的知识点,希望这篇文章都能帮到你!