【求集合中“相同元素”某个属性的和】
注意:我这里“相同元素”指的是“某个字段相同”,而不是整个对象相同
- 建议先运行一遍程序,然后再看
public static void main(String[] args) {
// 测试数据
List<TpeSchemeCourseClassDto> courseClassList = new ArrayList<>();
courseClassList.add(new TpeSchemeCourseClassDto().setFClassNum("1").setFCourseNum("001").setFDistCount(23));
courseClassList.add(new TpeSchemeCourseClassDto().setFClassNum("2").setFCourseNum("001").setFDistCount(52));
courseClassList.add(new TpeSchemeCourseClassDto().setFClassNum("3").setFCourseNum("001").setFDistCount(42));
courseClassList.add(new TpeSchemeCourseClassDto().setFClassNum("1").setFCourseNum("002").setFDistCount(34));
courseClassList.add(new TpeSchemeCourseClassDto().setFClassNum("2").setFCourseNum("002").setFDistCount(52));
courseClassList.add(new TpeSchemeCourseClassDto().setFClassNum("3").setFCourseNum("002").setFDistCount(44));
courseClassList.add(new TpeSchemeCourseClassDto().setFClassNum("1").setFCourseNum("003").setFDistCount(24));
courseClassList.add(new TpeSchemeCourseClassDto().setFClassNum("2").setFCourseNum("003").setFDistCount(53));
courseClassList.add(new TpeSchemeCourseClassDto().setFClassNum("3").setFCourseNum("003").setFDistCount(42));
// 1. 先按照相同字段(班级编码)进行分组
Map<String, List<TpeSchemeCourseClassDto>> collect = courseClassList.stream().collect(Collectors.groupingBy(TpeSchemeCourseClassDto::getFClassNum));
// 2. 遍历这个 Map
for (String key : collect.keySet()) {
List<TpeSchemeCourseClassDto> courseClassDtos = collect.get(key);
// 3. 求 fDistCount 该属性的和
long sum = courseClassDtos.stream().mapToInt(TpeSchemeCourseClassDto::getFDistCount).summaryStatistics().getSum();
System.out.println(key + " ===== " + sum);
}
/*
结果
1 ===== 81
2 ===== 157
3 ===== 128
*/
}
/**
* 实体类
*/
@Data
@Accessors(chain = true)
public static class TpeSchemeCourseClassDto {
/** 班级编码 */
private String fClassNum;
/** 课程编码 */
private String fCourseNum;
/** 当前课程分配人数 */
private Integer fDistCount;
/** 课程名称 */
private String courseName;
}