java8 stream 多字段分组、多个列汇总统计

import lombok.Data;
import java.util.Date;
 
@Data
public class AttendanceStatisticByDayDTO {
 
    /**
     * 员工ID
     */
    private String userId;
 
    /**
     * 员工编码
     */
    private String userCode;
 
    /**
     * 员工名称
     */
    private String userName;
 
    /**
     * 统计日期
     */
    private Date statisticDate;
 
    /**
     * 应上时长
     */
    private Float workDueHour;
 
    /**
     * 实上时长
     */
    private Float workRealHour;
 
    /**
     * 统计次数
     */
    private Integer statisticTimes;
 
    /**
     * 考勤配置ID
     */
    private String attendanceTypeId;
 
    /**
     * 考勤配置名称
     */
    private String attendanceTypeName;
}

  

 
/**
 * 用于统计的值
 */
@Data
public class ComputeGroupByDTO {
 
    /**
     * 总条数
     */
    private long totalCount;
 
    /**
     * 总的工作小时数
     */
    private Double dueHourSum;
 
    /**
     * 真实的小时数
     */
    private Double realHourSum;
}

  测试代码:

/**
 * 分组的条件
 *
 * @param attendanceStatisticByDayDTO 考勤统计
 * @return 返回分组的KEY
 */
private static AttendanceStatisticByDayDTO fetchGroupKey(final AttendanceStatisticByDayDTO attendanceStatisticByDayDTO) {
    final AttendanceStatisticByDayDTO statisticByDay = new AttendanceStatisticByDayDTO();
    statisticByDay.setUserId(attendanceStatisticByDayDTO.getUserId());
    statisticByDay.setUserCode(attendanceStatisticByDayDTO.getUserCode());
    statisticByDay.setUserName(attendanceStatisticByDayDTO.getUserName());
    statisticByDay.setStatisticDate(attendanceStatisticByDayDTO.getStatisticDate());
    statisticByDay.setAttendanceTypeId(attendanceStatisticByDayDTO.getAttendanceTypeId());
    statisticByDay.setAttendanceTypeName(attendanceStatisticByDayDTO.getAttendanceTypeName());
    return statisticByDay;
}
 
public static void main(final String[] args) {
    final List<AttendanceStatisticByDayDTO> attendanceStatisticByDayDTOS = new ArrayList<>();
    for (int i = 0; i < 100; i++) {
        final AttendanceStatisticByDayDTO attendanceStatisticByDayDTO = new AttendanceStatisticByDayDTO();
        attendanceStatisticByDayDTO.setUserId("" + (i % 5));
        attendanceStatisticByDayDTO.setUserCode("" + (i % 5));
        attendanceStatisticByDayDTO.setUserName("" + (i % 5));
        attendanceStatisticByDayDTO.setWorkDueHour((float) (i % 5));
        attendanceStatisticByDayDTO.setWorkRealHour((float) (i % 5));
        attendanceStatisticByDayDTO.setStatisticTimes(i);
        attendanceStatisticByDayDTO.setAttendanceTypeId("" + (i % 5));
        attendanceStatisticByDayDTO.setAttendanceTypeName("" + (i % 5));
        attendanceStatisticByDayDTOS.add(attendanceStatisticByDayDTO);
    }
    final Map<AttendanceStatisticByDayDTO, ComputeGroupByDTO> groupByMap = attendanceStatisticByDayDTOS.stream()
            .collect(Collectors.groupingBy(n -> fetchGroupKey(n)
                    , Collectors.collectingAndThen(Collectors.toList(), m -> {
                        final long totalCount = m.stream().count();
                        final Double dueHourSum = m.stream()
                                .mapToDouble(AttendanceStatisticByDayDTO::getWorkDueHour).sum();
                        final Double realHourSum = m.stream()
                                .mapToDouble(AttendanceStatisticByDayDTO::getWorkDueHour).sum();
                        final ComputeGroupByDTO computeGroupBy = new ComputeGroupByDTO();
                        computeGroupBy.setTotalCount(totalCount);
                        computeGroupBy.setDueHourSum(dueHourSum);
                        computeGroupBy.setRealHourSum(realHourSum);
                        return computeGroupBy;
                    })));
    System.out.println("groupByMap=" + groupByMap.size());
    groupByMap.forEach((k, v) -> {
        System.out.println(JSON.toJSONString(k));
        System.out.println(JSON.toJSONString(v));
    });
}

  响应结果:

groupByMap=5
{"attendanceTypeId":"4","attendanceTypeName":"4","userCode":"4","userId":"4","userName":"4"}
{"dueHourSum":80.0,"realHourSum":80.0,"totalCount":20}
{"attendanceTypeId":"0","attendanceTypeName":"0","userCode":"0","userId":"0","userName":"0"}
{"dueHourSum":0.0,"realHourSum":0.0,"totalCount":20}
{"attendanceTypeId":"3","attendanceTypeName":"3","userCode":"3","userId":"3","userName":"3"}
{"dueHourSum":60.0,"realHourSum":60.0,"totalCount":20}
{"attendanceTypeId":"1","attendanceTypeName":"1","userCode":"1","userId":"1","userName":"1"}
{"dueHourSum":20.0,"realHourSum":20.0,"totalCount":20}
{"attendanceTypeId":"2","attendanceTypeName":"2","userCode":"2","userId":"2","userName":"2"}
{"dueHourSum":40.0,"realHourSum":40.0,"totalCount":20}

  转载自:https://www.codeleading.com/article/70612697429/

posted @ 2025-07-03 20:52    阅读(71)  评论(0)    收藏  举报