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 ListattendanceStatisticByDayDTOS = 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 MapgroupByMap = 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}