
本文介绍如何使用 Java Stream API 将学生对象数组高效扁平化为单一的 Stream,提取所有科目下所有学生的全部成绩。核心在于两次 flatMap:先展开各学生科目成绩映射的值集合,再展开每个科目对应的成绩列表。
本文介绍如何使用 java stream api 将学生对象数组高效扁平化为单一的 `stream
在 Java 8+ 中,Stream 是处理集合数据的强大抽象。当面对嵌套结构(如 StudenT[] → Map
关键实现如下:
Stream<integer> allMarks = Arrays.stream(students)
.flatMap(student -> student.getMarks().values().stream()) // Step 1: Stream<list>>
.flatMap(Collection::stream); // Step 2: Stream<integer></integer></list></integer>
- 第一次 flatMap:对每个 StudenT 调用 getMarks().values(),获取其所有科目的成绩列表(即 Collection
- >),再将其转为 Stream
- >;
- 第二次 flatMap:使用方法引用 Collection::stream,将每个 List
展开为独立的 Integer 元素,最终合并为单层 Stream 。
✅ 完整可运行示例:
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Lesson6 {
public static void main(String[] args) {
Map<string list>> markAnn = new HashMap();
markAnn.put("Physics", List.of(4, 4, 5));
markAnn.put("Mathematics", List.of(2, 3, 4));
Map<string list>> markKate = new HashMap();
markKate.put("Physics", List.of(1, 2, 3));
markKate.put("Mathematics", List.of(5, 5, 3));
StudenT[] students = {
new StudenT("Ann", markAnn),
new StudenT("Kate", markKate)
};
Stream<integer> allMarks = Arrays.stream(students)
.flatMap(s -> s.getMarks().values().stream())
.flatMap(Collection::stream);
// 示例:打印所有成绩
allMarks.forEach(System.out::println);
// 输出:4 4 5 2 3 4 1 2 3 5 5 3(顺序取决于 map 迭代与 list 顺序)
}
}
class StudenT {
private final String name;
private final Map<string list>> marks;
public StudenT(String name, Map<string list>> marks) {
this.name = name;
this.marks = marks;
}
public String getName() { return name; }
public Map<string list>> getMarks() { return marks; }
}</string></string></string></integer></string></string>
⚠️ 注意事项:
- 使用 Arrays.stream(students) 而非 Stream.of(students),后者会将整个数组视为单个元素(生成 Stream
),导致后续操作失败; - getMarks().values() 返回的是 Collection
- >,其遍历顺序不保证(若需确定顺序,建议使用 LinkedHashMap 或显式排序);
- 若需去重或统计,可在最终流上链式调用 .distinct()、.count() 等终端操作;
- 对于空学生或空成绩映射,建议增加 filter(Objects::nonNull) 或 filter(m -> !m.isEmpty()) 做防御性处理。
通过两次 flatMap 的组合,我们以声明式、函数式的方式优雅地完成了深层嵌套结构的扁平化,体现了 Stream API 在数据转换中的简洁性与表现力。










