java8 stream agrupación de campos múltiples, estadísticas de resumen de varias columnas

 AttendanceStatisticByDayDTO :

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;
}

 ComputeGroupByDTO:


/**
 * 用于统计的值
 */
@Data
public class ComputeGroupByDTO {

    /**
     * 总条数
     */
    private long totalCount;

    /**
     * 总的工作小时数
     */
    private Double dueHourSum;

    /**
     * 真实的小时数
     */
    private Double realHourSum;
}

Código de prueba:

/**
 * 分组的条件
 *
 * @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));
    });
}

Resultado de la respuesta:

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}

 

Supongo que te gusta

Origin blog.csdn.net/qq_38428623/article/details/103754446
Recomendado
Clasificación