stream流flatMap方法
时间: 2025-04-30 21:31:02 浏览: 23
### Java Stream API 中 `flatMap` 方法详解
#### 什么是 `flatMap`
`flatMap` 是 Java Stream API 提供的一个中间操作,用于将多个流合并成一个单一的流。与 `map` 不同的是,`map` 将每个输入元素转换为另一个单个输出元素,而 `flatMap` 可以将每个输入元素映射到零个、一个或多个输出元素上[^1]。
#### 实际应用案例
考虑有一个字符串列表,其中每个字符串都由逗号分隔开单词:
```java
List<String> list = Arrays.asList("Java,is,powerful", "Stream,API,is,useful", "flatMap,is,amazing");
```
目标是从这个列表中提取所有的单词并创建一个新的列表。通过使用 `flatMap` 和 `split()` 函数可以轻松完成此任务:
```java
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class FlatMapExample {
public static void main(String[] args) {
List<String> phrases = Arrays.asList(
"Java,is,powerful",
"Stream,API,is,useful",
"flatMap,is,amazing"
);
List<String> words = phrases.stream()
.flatMap(s -> Arrays.stream(s.split(",")))
.collect(Collectors.toList());
System.out.println(words);
}
}
```
这段代码会打印出如下结果:
```
[Java, is, powerful, Stream, API, is, useful, flatMap, is, amazing]
```
这里的关键在于 `flatMap` 的作用——它接收一个函数作为参数,并对该函数返回的结果进行扁平化处理再传递给下游的操作。在这个例子中,先是对每一个字符串调用了 `split(",")` 来分割它们成为数组形式;接着这些数组被转化为新的流对象并通过 `flatMap` 合并成为一个单独的大流[^3]。
#### 多对多关系 (One-to-Many)
当涉及到复杂的数据结构比如嵌套集合时,`flatMap` 显示出了其强大的功能。假设存在班级(Classroom),班级里有若干小组(Group), 而每组又包含了多名学生(Student):
```java
class Classroom {
private String name;
private Set<Group> groups;
// getters and setters...
}
class Group {
private int id;
private Collection<Student> students;
// getters and setters...
}
// ... Student 类定义 ...
```
如果想要获取所有学生的名单,则可以通过下面的一行代码来实现:
```java
List<Student> allStudents = classrooms.stream()
.flatMap(classroom -> classroom.getGroups().stream())
.flatMap(group -> group.getStudents().stream())
.collect(Collectors.toList());
```
上述代码展示了如何利用两次 `flatMap` 操作遍历多层次的对象层次结构,最终得到所需的学生列表[^2]。
#### 结合其他流操作
除了基本的例子外,在实际开发过程中还可以结合其他的流操作符一起工作,例如过滤(filtering) 或者排序(sorting)[^4]:
```java
List<Integer> numbersA = Arrays.asList(1, 2, 3);
List<Integer> numbersB = Arrays.asList(3, 4);
List<int[]> pairs =
numbersA.stream()
.flatMap(a -> numbersB.stream()
.filter(b -> (a + b) % 3 == 0)
.map(b -> new int[]{a, b}))
.collect(Collectors.toList());
```
该片段实现了从两个整数列表中找出满足特定条件(两数之和能被三整除)的所有配对组合。
阅读全文
相关推荐


















