获取数据状态最大且更新时间最新的数据四种排序方式

复制代码
    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;
    }
相关推荐
程序员清风3 小时前
Java 后端高并发设计:线程池、限流、熔断与降级
java·数据库·oracle
李少兄3 小时前
JavaScript 数据类型完全指南
开发语言·javascript·ecmascript
Seoyoneh4 小时前
Agentic Workflow编排架构:云客服从“被动响应”迈向“主动执行”的技术实现
java·开发语言·架构
海南java第二人4 小时前
对外 API 如何保证幂等性?插入数据 / 上传表格场景全方案汇总
java·幂等性
tryxr4 小时前
Chat2Excel 文件服务模块上传文件功能开发
java·项目·oss·easyexcel·文件服务
Tangyuewei4 小时前
Java 写 Agent:模型只是组件
java·开发语言
小玮看世界5 小时前
[Python]从合并区间到传感器融合区:合并区间在传感器区域融合的实际落地
开发语言·python
彧azz5 小时前
Java学习语法篇:变量
java·学习
繁星蓝雨5 小时前
C++的设计与演进大纲(如何从C语言一步步成长为C++)
c语言·开发语言·c++·c++历史·c++演进
Evand J6 小时前
【MATLAB例程,图像降噪滤波9】自适应维纳滑动窗口滤波(Wiener)图像降噪、方法对比,有中文注释
开发语言·图像处理·计算机视觉·matlab·滑动窗口·滤波·降噪