面向初学者的 Java 8 Stream + FlatMap 示例 | 如何扁平化 Java 中包含列表的列表?
为了理解 flatMap()
方法,首先需要理解Java 8的 map()
函数。map()
函数声明在 java.util.stream.Stream 类中,用于将一个Stream转换为另一个Stream, 例如,它可以将整数流转换为另一个整数流,其中每个元素都是源流中相应元素的平方。 在 map() 操作中,将一个函数应用于源流的每个元素,并将返回值插入到返回给调用者的新流中。 这里要注意的关键点是 map()
操作使用的函数返回单个值。
现在,如果 map 操作使用一个函数,而不是返回单个值,而是返回一个值流,就像当您给出一个数字并返回该数字的所有质因数时,那么您就有了一个整数流。 这就是 flatmap 函数的帮助所在。
flatMap()
方法可用于将该流展平为整数流。 例如,假设我们有一个数字列表,例如 [21, 23, 42],我们调用 getPrimeFactors()
方法以及 map() 操作来转换此流。
结果将是 [[3,7],[23],[2,3,7]]
。 如果你想将这个包含流的流扁平化为值流,你可以使用最终返回 [3,7,2,3,2,3,7]
的 flatMap()
。
简而言之,flatMap()
函数用于将 Stream 的 Stream 转换为值列表。
flatMap 在 Java 8 中是如何工作的?
如果我们还没有全面了解并且难以理解 flatMap 函数究竟是如何工作的,那么这里有一个图表,它可以帮助我们理解。 据说一张图片胜过一千个单词,这是真的,下图非常容易地解释了 flatMap
在 Java 8 中的工作原理:
你可以看到有两个列表,一个用红色表示,另一个用绿色表示,它们都包含三个元素。 一旦你对它们应用了 flatMap ,你就可以得到另一个包含它们元素的列表。
我们可以看到,在第二个管道中,我们有 3 个来自绿色列表的元素,分别用 1、2 和 3 表示,另外三个来自红色列表的元素,分别用 4、5 和 6 表示。
Java 8 FlatMap 示例 - Java 中流的平面流
这是一个示例 Java 程序,用于演示如何在 Java 8 中使用 flatMap()
函数。正如我们告诉大家的,我们可以使用 flatMap()
将值流的流扁平化为值流。
在我们的示例中,我们有一个字符串列表流,通过使用 flatMap()
,我们将其转换为一个字符串流,以获取参加世界杯的完整球员列表。
这是我们的 Java 程序,用于演示如何在 Java 8 中使用 Stream.flatMap()
。
package test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class Test {
public static void main(String args[]) {
List<String> teamIndia = Arrays.asList("Virat", "Dhoni", "Jadeja");
List<String> teamAustralia = Arrays.asList("Warner", "Watson", "Smith");
List<String> teamEngland = Arrays.asList("Alex", "Bell", "Broad");
List<String> teamNewZeland = Arrays.asList("Kane", "Nathan", "Vettori");
List<String> teamSouthAfrica = Arrays.asList("AB", "Amla", "Faf");
List<String> teamWestIndies = Arrays.asList("Sammy", "Gayle", "Narine");
List<String> teamSriLanka = Arrays.asList("Mahela", "Sanga", "Dilshan");
List<String> teamPakistan = Arrays.asList("Misbah", "Afridi", "Shehzad");
List<List<String>> playersInWorldCup2016 = new ArrayList<>();
playersInWorldCup2016.add(teamIndia);
playersInWorldCup2016.add(teamAustralia);
playersInWorldCup2016.add(teamEngland);
playersInWorldCup2016.add(teamNewZeland);
playersInWorldCup2016.add(teamSouthAfrica);
playersInWorldCup2016.add(teamWestIndies);
playersInWorldCup2016.add(teamSriLanka);
playersInWorldCup2016.add(teamPakistan);
List<String> listOfAllPlayers = new ArrayList<>();
for (List<String> team : playersInWorldCup2016) {
for (String name : team) {
listOfAllPlayers.add(name);
}
}
System.out.println("Players playing in world cup 2016");
System.out.println(listOfAllPlayers);
// 现在让我们使用 FlatMap 在 Java 8 中执行此操作
List<String> flatMapList = playersInWorldCup2016.stream().flatMap(pList -> pList.stream()).collect(Collectors.toList());
System.out.println("List of all Players using Java 8");
System.out.println(flatMapList);
}
}
大家可以看到最终列表包含每个列表中的所有元素。 所以 flatMap()
可以很好地将字符串列表流扁平化为字符串流,这就是 Java 8 中 flatMap 操作的真正威力。
这就是关于如何在 Java 8 中使用 flatMap()
函数的全部内容。只需记住 Java 8 中 map() 和 flatMap() 之间的区别 以及何时使用 map()
与 flatMap()
。 如果我们使用在 map() 操作中返回值列表的函数,我们将获得流式流,通过使用 flatMap
,我们可以将其转换为值的流。
简而言之,我们可以使用 flatMap()
将几个小的值列表组合成一个大的值列表。 它被称为 flatMap()
是因为它使 Stream 扁平化。
相关文章
Do you understand JavaScript closures?
发布时间:2025/02/21 浏览次数:108 分类:JavaScript
-
The function of a closure can be inferred from its name, suggesting that it is related to the concept of scope. A closure itself is a core concept in JavaScript, and being a core concept, it is naturally also a difficult one.
Do you know about the hidden traps in variables in JavaScript?
发布时间:2025/02/21 浏览次数:178 分类:JavaScript
-
Whether you're just starting to learn JavaScript or have been using it for a long time, I believe you'll encounter some traps related to JavaScript variable scope. The goal is to identify these traps before you fall into them, in order to av
How much do you know about the Prototype Chain?
发布时间:2025/02/21 浏览次数:150 分类:JavaScript
-
The prototype chain can be considered one of the core features of JavaScript, and certainly one of its more challenging aspects. If you've learned other object-oriented programming languages, you may find it somewhat confusing when you start
如何在 JavaScript 中合并两个数组而不出现重复的情况
发布时间:2024/03/23 浏览次数:86 分类:JavaScript
-
本教程介绍了如何在 JavaScript 中合并两个数组,以及如何删除任何重复的数组。