关于Map循环遍历去除数据bug

在循环map中时,要在map循环以后再remove,否则会出现null Exception。 

```markdown ### 代码概述 该文件为一段 Java 服务层代码,用于分页查询项目信息。原始逻辑中存在缓存滥用、Feign 数据缓存不合理、非管理员路径重复查询等问题。根据新需求:**先分页查数据,再实时调用 Feign 服务补全字段,且不再将 Feign 结果放入缓存**,需重构代码。 --- ### 修改后的正确代码(含注释) ```java @Override public Page<ProjectInfoEntity> listByPage(ProjectInfoDto dto, Long pageNum, Long pageSize) { // 创建分页对象 Page<ProjectInfoEntity> page = new Page<>(pageNum, pageSize); // 无论是否管理员,统一先执行数据库分页查询(以 dto 条件为基础) Page<ProjectInfoEntity> result = projectInfoDao.selectPage(page, getQueryWrapper(dto)); // 获取查询到的项目 ID 列表,用于后续远程调用 List<String> projectIds = result.getRecords().stream() .map(ProjectInfoEntity::getProjectId) .filter(id -> id != null && !id.trim().isEmpty()) .collect(Collectors.toList()); // 若无项目 ID,则无需补全字段 if (projectIds.isEmpty()) { return result; } // 实时调用 Feign 接口获取补充信息(如组织名、负责人等),不应缓存 Map<String, String> orgIdToNameMap = projectRemoteService.getOrgNamesByIds(projectIds); // 假设接口:按项目ID批量获取组织名称 Map<String, ProjectOwnerInfo> projectIdToOwnerMap = projectRemoteService.getProjectOwnersByIds(projectIds); // 获取负责人信息 // 遍历结果,补充缺失字段 result.getRecords().forEach(item -> { String projectId = item.getProjectId(); // 补充组织名称 if (orgIdToNameMap.containsKey(item.getOrgId())) { item.setOrgName(orgIdToNameMap.get(item.getOrgId())); } // 补充项目负责人信息 if (projectIdToOwnerMap.containsKey(projectId)) { ProjectOwnerInfo ownerInfo = projectIdToOwnerMap.get(projectId); item.setProjectOwnerId(ownerInfo.getOwnerId()); item.setProjectOwner(ownerInfo.getOwnerName()); } // 标记是否为重点项目(IMP) item.setIsHvProject(ProjectStatusEnum.IMP.name().equals(item.getProjectStatus())); // 判断是否为“我的项目” —— 可选:也可由前端或权限服务决定 List<String> userAccessibleProjectIds = userProjectRoleFeignService.getProjectIdBySelf(); item.setIsMyProject(!userAccessibleProjectIds.isEmpty() && userAccessibleProjectIds.contains(projectId) && ProjectStatusEnum.IMP.name().equals(item.getProjectStatus())); }); return result; } ``` --- ### 代码解析 | 步骤 | 说明 | |------|------| | 1 | 统一分页查询主数据,避免管理员与非管理员两套逻辑,简化流程。 | | 2 | 提取项目 ID 列表,作为远程调用参数,减少无效请求。 | | 3 | **关键变更**:不再依赖本地缓存补全 `orgName` 和 `owner` 信息,改为**实时调用 Feign 接口**获取。 | | 4 | 使用新的远程服务接口(示例命名)批量获取组织名和负责人信息,保证高效和实时性。 | | 5 | 对每条记录动态填充字段,确保响应完整。 | | 6 | “我的项目”判断仍需调用 `userProjectRoleFeignService` 实时获取用户权限列表。 | > ✅ **优点**: > - 数据一致性更强(避免缓存过期问题) > - 逻辑清晰,去除了冗余分支 > - 符合“查数据 → 补字段”的线性流程 > ⚠️ **注意**: > - 新增的 `projectRemoteService` 应是一个 Feign Client,提供批量查询接口,否则 N 次调用会导致性能问题。 > - 生产环境建议增加熔断降级(如 Hystrix 或 Sentinel)防止远程服务不可用影响主流程。 --- ### 知识点 1. **Feign 批量查询设计原则** 避免循环调用,应设计批量接口(如 `/api/project/owners?ids=...`)提升性能与稳定性。 2. **Stream 提取字段与过滤空值** 使用 `stream().map().filter()` 安全提取项目 ID,防止空指针异常。 3. **关注实时性 vs 缓存权衡** 用户权限、组织架构等变化频繁的数据不宜缓存,应实时查询以保障准确性。 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值