// 获取运动员信息 List<MatchGameRunnerDo> runnerDos = selectRunnerList(gameId, null ,teamId,null); if (CollectionUtil.isEmpty(runnerDos)) { return ListUtil.empty(); } List<MatchGameRunnerScoreInfoVo> list = BeanUtils.toBean(runnerDos, MatchGameRunnerScoreInfoVo.class); List<RunnerScoreQueryParam> queryParams = list.stream().map(r -> new RunnerScoreQueryParam(r.getGameId(), r.getHcId(), r.getTeamId())).collect(Collectors.toList()); List<MatchGameRunnerScoreVo> matchGameRunnerScoreVos = matchGameSorceMapper.selectRunnerScore(queryParams); for (int i = 0; i < list.size(); i++) { for (int j = 0; j < matchGameRunnerScoreVos.size(); j++) { if(list.get(i).getGameId().equals(matchGameRunnerScoreVos.get(i).getGameId()) && list.get(i).getHcId().equals(matchGameRunnerScoreVos.get(i).getHcId())) setRunnerScoreValue(list.get(i),matchGameRunnerScoreVos.get(i)); } }帮我优化代码
时间: 2025-04-05 10:14:26 浏览: 38
以下是对你提供的代码片段的优化建议,旨在提高代码可读性和性能。
---
### 已知问题分析
1. **双重循环效率低**
当前代码使用了嵌套双层循环(`i` 和 `j`)来比较两个列表的内容。如果两个列表长度分别为 `m` 和 `n`,这种实现的时间复杂度为 O(m * n),当数据量较大时会显著降低性能。
2. **重复获取对象属性**
在内层循环中多次调用了 `list.get(i)` 和 `matchGameRunnerScoreVos.get(j)` 来访问对象属性,增加了不必要的开销。
3. **未充分利用集合工具类的优势**
可以通过哈希表等高效的数据结构减少查找次数。
4. **代码冗长不易维护**
现有的代码逻辑分散在多处,增加后续调试和扩展难度。
---
### 优化后的代码
基于以上问题点,我们可以重构代码如下:
```java
// 获取运动员信息
List<MatchGameRunnerDo> runnerDos = selectRunnerList(gameId, null, teamId, null);
if (CollectionUtil.isEmpty(runnerDos)) {
return ListUtil.empty();
}
// 转换为 VO 列表
List<MatchGameRunnerScoreInfoVo> infoVoList = BeanUtils.toBean(runnerDos, MatchGameRunnerScoreInfoVo.class);
// 构造查询参数
List<RunnerScoreQueryParam> queryParams = infoVoList.stream()
.map(info -> new RunnerScoreQueryParam(
info.getGameId(),
info.getHcId(),
info.getTeamId()))
.collect(Collectors.toList());
// 查询分数信息
List<MatchGameRunnerScoreVo> scoreVoList = matchGameSorceMapper.selectRunnerScore(queryParams);
// 使用 HashMap 提高匹配效率
Map<String, MatchGameRunnerScoreVo> scoreMap = scoreVoList.stream()
.collect(Collectors.toMap(
vo -> vo.getGameId() + "_" + vo.getHcId(), // 键:组合唯一标识
vo -> vo // 值:对应的对象
));
infoVoList.forEach(vo -> {
String key = vo.getGameId() + "_" + vo.getHcId(); // 构造键
if (scoreMap.containsKey(key)) { // 查找是否存在对应的 ScoreVo
setRunnerScoreValue(vo, scoreMap.get(key)); // 设置分数值
}
});
return infoVoList;
```
---
### 优化思路详解
1. **用 Map 替代双重循环**
- 我们将 `scoreVoList` 数据存入一个 `HashMap`,其键由 `gameId` 和 `hcId` 组合而成,保证每个键值对都是唯一的。
- 此后只需遍历一次 `infoVoList` 即可在常数时间内完成匹配操作,时间复杂度降为 O(n + m)。
2. **避免重复调用 getter 方法**
- 将原本频繁调用的 `getGameId()` 和 `getHcId()` 移动至构造键的过程中集中处理,减少了每次循环内的额外开销。
3. **简化流程提升清晰度**
- 新增变量命名更贴实际业务含义(如 `infoVoList`, `queryParams` 等),使得每一步的作用明确直观;
- 合理利用流式编程风格进一步压缩行数,让整体显得紧凑而不失条理性。
4. **返回结果封装一致性检查**
如果存在找不到符合条件的情况也不会影响最终输出完整性;同时保持原有函数签名不变方便上下游对接工作继续沿用当前规范。
---
### 测试与验证
为了确保改动无误,应该针对边界条件进行全面测试:
- 输入为空或仅有少量元素的情况下是否正常退出;
- 存在一个及以上有效关联关系时能否成功绑定得分记录;
- 全部均为无效链接情形下确认不会抛异常也返回空集合即可。
此外还可以借助单元测验框架编写自动化脚本快速定位潜在缺陷区域加以修复完善直至满足预期目标为止!
---
阅读全文
相关推荐


















