当前位置: 代码迷 >> 综合 >> java8 stream 多字段分组、多个列汇总统计
  详细解决方案

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

热度:7   发布时间:2023-12-18 11:36:26.0

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

测试代码:

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

 

 

  相关解决方案