发布于2026-07-10 阅读(0)
扫一扫,手机访问
先用 Stream 把 Student 数组转成格式化字符串?这事儿其实不少人第一反应就是“不就用个 map 就完了吗”,但真上手时特别容易踩坑——稍不留神,学生的名字和成绩就对不上号了。
怎么理解这个需求?假设有三个学生:Ann、Mike、Kate,每个人有多门课,每门课下面又有多个分数。最终要得到的结果是类似“Ann: [4, 4, 5, 2, 3, 4]”这种形式——注意这里的数字列表可不是某一门课的成绩,而是该学生所有科目所有分数合并成的一个扁平列表。换句话说,要做的就是:把每个学生对象当作一个独立的加工单元,先取出姓名,再取出他所有课程的所有分数,打平,变成一个整整齐齐的一维列表,最后按格式拼成字符串。
很多新手会犯的错误是用 flatMap 直接把所有人的成绩混成一条流,然后才发现 Ann 的成绩里冒出了 Kate 的分数。原因很简单——流式处理一旦跨过了学生的边界,姓名和成绩之间的匹配关系就断了。
正确的做法其实很直接:对 students 数组创建流 → 对每个 Stud7 实例单独用 map 做转换 → 提取姓名 → 把 marks.values() 里的多个 List
来看个完整可运行的例子:
import ja va.util.*;
import ja va.util.stream.Collectors;
public class Lesson7 {
public static void main(String[] args) {
Map> markAnn = new HashMap<>();
markAnn.put("Physics", List.of(4, 4, 5));
markAnn.put("Mathematics", List.of(2, 3, 4));
Map> markKate = new HashMap<>();
markKate.put("Physics", List.of(1, 2, 3));
markKate.put("Mathematics", List.of(5, 5, 3));
Stud7[] students = {
new Stud7("Ann", markAnn),
new Stud7("Kate", markKate)
};
Stream resultStream = Arrays.stream(students)
.map(student -> {
List allMarks = student.getMarks().values().stream()
.flatMap(List::stream)
.collect(Collectors.toList());
return student.getName() + ": " + allMarks;
});
resultStream.forEach(System.out::println);
}
private static class Stud7 {
private final String name;
private final Map> marks;
public Stud7(String name, Map> marks) {
this.name = name;
this.marks = marks;
}
public String getName() { return name; }
public Map> getMarks() { return marks; }
}
}
这段代码跑出来的结果:
几个关键点值得注意:
这件事的核心其实就一句话:流式处理里,每个元素的独立加工是保证数据一致性的基石。把这一步想明白了,写出来的代码才真正靠谱。
上一篇:如何修复 Java Swing 中 VCR 文字碰撞角落时的越界抖动问题
下一篇:如何在 Java 中使用 java.util.concurrent.CountDownLatch 让主线程等待多个并行初始化任务完成
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8