public static void main(String[] args) {
List<MonthDTO> allDayDtos = getMonthDTOS();
// 去除状态最大的数据
allDayDtos.removeIf(data -> data.getStatus().equals("12") || data.getStatus().equals("99"));
// 根据状态降序排序 第一种方式
allDayDtos.sort(Comparator.comparing(MonthDTO::getStatus).reversed());
// 按照区间分组
Map<String, List<MonthDTO>> groupMap = new HashMap<>();
for (MonthDTO monthDTO : allDayDtos) {
String intervalKey = monthDTO.getStartDate() + "_" + monthDTO.getEndDate() + "-" + monthDTO.getVcCombiId() + "_" + monthDTO.getVcFeeType();
groupMap.computeIfAbsent(intervalKey, k -> new ArrayList<>()).add(monthDTO);
}
// 处理每个区间的数据,获取数据状态最大且更新时间最新的数据
List<MonthDTO> latestDataList = getPayManageDayDTOS(groupMap);
System.out.println("第一种方式:" + latestDataList);
// 第二种方式
Map<String, Map<String, MonthDTO>> monthGroupMap = allDayDtos.stream()
.collect(Collectors.groupingBy(MonthDTO::getId, Collectors.toMap(MonthDTO::getVcFeeType,Function.identity(), BinaryOperator.maxBy(Comparator.comparing(MonthDTO::getStatus)))));
// 处理每个区间的数据,获取数据状态最大且更新时间最新的数据
Map<String, MonthDTO> dtoMap = monthGroupMap.values().stream()
.flatMap(group -> group.values().stream())
.collect(Collectors.toMap(
data -> data.getId() + "_" + data.getVcFeeType() + "_" + data.getStartDate() + "_" + data.getEndDate(),
data -> allDayDtos.stream().filter(d -> d.getVcCombiId().equals(data.getVcCombiId()) &&
d.getVcFeeType().equals(data.getVcFeeType()) &&
d.getStatus().equals(data.getStatus()))
.max(Comparator.comparing(MonthDTO::getUpdateTime))
.orElse(data)));
List<MonthDTO> latesr = new ArrayList<>(dtoMap.values());
System.out.println("第二种方式:" + latesr);
// 第三种方式
List<MonthDTO> latestDataList3 = allDayDtos.stream()
.collect(Collectors.groupingBy(d -> Arrays.asList(d.getStartDate(), d.getEndDate(), d.getVcCombiId(), d.getVcFeeType())))
.values().stream()
.map(group -> group.stream().max(Comparator.comparing(MonthDTO::getStatus).thenComparing(MonthDTO::getUpdateTime)).orElse(null))
.filter(Objects::nonNull)
.collect(Collectors.toList());
System.out.println("第三种方式:" + latestDataList3);
// 第四种方式
List<MonthDTO> latestDataList4 = allDayDtos.stream()
// 按照开始日期、结束日期、组合ID、类型分组
.collect(Collectors.groupingBy(d -> d.getStartDate() + "_" + d.getEndDate() + "_" + d.getVcCombiId() + "_" + d.getVcFeeType()))
// 对每个分组进行处理
.values().stream()
.map(group -> group.stream()
// 先按状态降序排序
.sorted(Comparator.comparing(MonthDTO::getStatus).reversed()
// 状态相同的按更新时间降序排序
.thenComparing(MonthDTO::getUpdateTime, Comparator.reverseOrder()))
// 取第一个(状态最大且更新时间最新)
.findFirst()
.get())
// 收集结果
.collect(Collectors.toList());
System.out.println("第四种方式:" + latestDataList4);
}
@NotNull
private static List<MonthDTO> getPayManageDayDTOS(Map<String, List<MonthDTO>> groupMap) {
List<MonthDTO> latestDataList = new ArrayList<>();
for (List<MonthDTO> monthDTOList : groupMap.values()) {
MonthDTO monthDTO = monthDTOList.get(0);
for (MonthDTO dto : monthDTOList) {
if (dto.getStartDate().equals(monthDTO.getStartDate()) &&
dto.getEndDate().equals(monthDTO.getEndDate()) &&
dto.getStatus().equals(monthDTO.getStatus()) &&
dto.getUpdateTime().after(monthDTO.getUpdateTime())) {
monthDTO = dto;
}
}
latestDataList.add(monthDTO);
}
return latestDataList;
}
private static List<MonthDTO> getMonthDTOS() {
List<MonthDTO> allDayDtos = new ArrayList<>();
MonthDTO dto = new MonthDTO();
dto.setId("01");
dto.setStartDate("20240101");
dto.setEndDate("20240104");
dto.setVcFeeType("GLF");
dto.setVcCombiId("1105");
dto.setStatus("7");
dto.setUpdateTime(DateUtil.parseDate("2025-01-01"));
allDayDtos.add(dto);
MonthDTO dto1 = new MonthDTO();
dto1.setId("01");
dto1.setStartDate("20240101");
dto1.setEndDate("20240104");
dto1.setVcFeeType("YJBC");
dto1.setVcCombiId("1105");
dto1.setStatus("7");
dto1.setUpdateTime(DateUtil.parseDate("2025-01-01"));
allDayDtos.add(dto1);
MonthDTO dto2 = new MonthDTO();
dto2.setId("22");
dto2.setStartDate("20240101");
dto2.setEndDate("20240104");
dto2.setVcFeeType("GLF");
dto2.setVcCombiId("1105");
dto2.setStatus("9");
dto2.setUpdateTime(DateUtil.parseDate("2025-01-01"));
allDayDtos.add(dto2);
MonthDTO dto3 = new MonthDTO();
dto3.setId("22");
dto3.setStartDate("20240101");
dto3.setEndDate("20240104");
dto3.setVcFeeType("YJBC");
dto3.setVcCombiId("1105");
dto3.setStatus("9");
dto3.setUpdateTime(DateUtil.parseDate("2025-01-01"));
allDayDtos.add(dto3);
return allDayDtos;
}
获取数据状态最大且更新时间最新的数据四种排序方式
峰回路转之后2026-01-04 9:00
相关推荐
忧郁的Mr.Li13 小时前
SpringBoot中实现多数据源配置玄同76513 小时前
从 0 到 1:用 Python 开发 MCP 工具,让 AI 智能体拥有 “超能力”czy878747513 小时前
深入了解 C++ 中的 `std::bind` 函数消失的旧时光-194313 小时前
从 Kotlin 到 Dart:为什么 sealed 是处理「多种返回结果」的最佳方式?yq19820430115613 小时前
静思书屋:基于Java Web技术栈构建高性能图书信息平台实践一个public的class13 小时前
你在浏览器输入一个网址,到底发生了什么?有位神秘人13 小时前
kotlin与Java中的单例模式总结Jinkxs13 小时前
Gradle - 与Groovy/Kotlin DSL对比 构建脚本语言选择指南&有梦想的咸鱼&13 小时前
Kotlin委托机制的底层实现深度解析(74)golang学习记14 小时前
IntelliJ IDEA 2025.3 重磅发布:K2 模式全面接管 Kotlin —— 告别 K1,性能飙升 40%!