假设有如下的学生成绩列表:
List scores = Arrays.asList(
new Score(“张三”, “语文”, 80, “表现不错”),
new Score(“李四”, “数学”, 90, “做题认真”),
new Score(“张三”, “数学”, 85, “有进步”),
new Score(“李四”, “语文”, 75, “注意细节”),
new Score(“王五”, “语文”, 85, “思维活跃”),
new Score(“王五”, “数学”, 95, “数学天才”)
);
可以使用Java 8的Stream API对其进行分组、求和和组装对象,代码如下:
Map<String, Map<String, ScoreSummary>> result = scores.stream()
.collect(Collectors.groupingBy(Score::getName, // 根据姓名分组
Collectors.groupingBy(Score::getSubject, // 根据科目分组
Collectors.reducing(new ScoreSummary(), // 初始值为ScoreSummary的空对象
(s1, s2) -> new ScoreSummary(s1.getScore() + s2.getScore(), // 求和
s1.getRemark() + “;” + s2.getRemark()))))); // 备注拼接
// ScoreSummary类的定义
class ScoreSummary {
private int score;
private String remark;
public ScoreSummary() {
this.score = 0;
this.remark = "";
}
public ScoreSummary(int score, String remark) {
this.score = score;
this.remark = remark;
}
// 省略getter和setter方法
}
上述代码中,使用了两层groupingBy
方法进行分组,最内层使用了reducing
方法对每组的成绩进行求和和备注拼接,并将结果组装成ScoreSummary
对象。最终得到的结果是一个Map<String, Map<String, ScoreSummary>>
类型的对象,其中外层的键是姓名,内层的键是科目,值是ScoreSummary
对象。可以根据需要对其进行进一步处理或输出。