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

 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);
        }
posted @ 2021-07-14 12:32  qwer78  阅读(443)  评论(0)    收藏  举报