两个list集合数据 根据某个属性值进行匹配融合,剩余的封装进新的集合

这段代码主要实现了对仪器设备使用和归还记录的整合。首先通过服务获取所有使用详情,然后根据类型对数据进行分组。接着,对使用和归还集合分别按ID降序排序,并遍历归还集合,将归还记录与使用记录匹配,如果归还时间晚于使用时间,则更新使用记录并存入新集合。最后,将未匹配的使用记录添加到新集合中,按照ID降序排序后导出为Excel文件。
摘要由CSDN通过智能技术生成
 List<ApparatusUsageDetailDTO> useDetailAll = usageService.findUseDetailAll(id, "");
        if (null == useDetailAll || useDetailAll.isEmpty()) {
            return;
        }
        //将全部数据根据 类型进行分组 为 使用集合 + 归还集合
        Map<Short, List<ApparatusUsageDetailDTO>> listMap = useDetailAll.stream().collect(Collectors.groupingBy(ApparatusUsageDetailDTO::getType, Collectors.toList()));
        //新集合
        List<ApparatusUsageDetailDTO> data = new ArrayList<>();
        //使用集合排序 按照id倒序 最大的排前面
        List<ApparatusUsageDetailDTO> useApparatus = listMap.get((short) 1).stream().sorted(Comparator.comparing(ApparatusUsageDetailDTO::getId).reversed()).collect(Collectors.toList());
        //归还集合排序 按照id倒序 最大的排前面
        List<ApparatusUsageDetailDTO> returnApparatus = listMap.get((short) 2).stream().sorted(Comparator.comparing(ApparatusUsageDetailDTO::getId).reversed()).collect(Collectors.toList());

        //遍历归还的仪器 将数据拼装在使用的字段中
        Iterator<ApparatusUsageDetailDTO> useApparatusIterator = useApparatus.iterator();
        Iterator<ApparatusUsageDetailDTO> returnDetailIterator = returnApparatus.iterator();
        while (returnDetailIterator.hasNext()) {
            //获取归还的仪器编号
            ApparatusUsageDetailDTO returnDetail = returnDetailIterator.next();
            String apparatusNumber = returnDetail.getApparatusNumber();
            Date backDate = returnDetail.getBackDate();
            //  获取领用记录中 当前编号的最大id的领用记录
            while (useApparatusIterator.hasNext()) {
                ApparatusUsageDetailDTO usageDetail = useApparatusIterator.next();
                //如果领用记录最新的仪器编号 和 当前归还记录的一致, 归还时间要大于领用时间
                if (usageDetail.getApparatusNumber().equalsIgnoreCase(apparatusNumber)
                        && backDate.after(usageDetail.getUsageDate())) {
                    //将归还时间和人 填充进使用记录对应字段
                    usageDetail.setBackDate(returnDetail.getBackDate());
                    usageDetail.setBackName(returnDetail.getBackName());
                    //将封装后的数据保存到data缓存list
                    data.add(usageDetail);
                    //使用集合移除这个记录
                    useApparatusIterator.remove();
                    //归还集合移除这个记录
                    returnDetailIterator.remove();
                    break;
                }

            }
        }
        //将使用集合剩余的元素添加到data中
        data.addAll(useApparatus);
        //需要导出的数据集合
        List<ApparatusUsageDetailDTO> collect = data.stream().sorted(Comparator.comparing(ApparatusUsageDetailDTO::getId).reversed()).collect(Collectors.toList());
        try {
            ExcelUtil.writeExcel(response, collect, "仪器设备出入库登记表", "仪器设备出入库登记表", ApparatusUsageDetailDTO.class);
        } catch (Exception e) {
            log.error("仪器设备出入库登记表导出接口异常", e);
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值