使用 java8 stream 实现 双层for循环下操作数据,for循环编写方式 and java8 stream 编写方式

双层for 循环代码

for(int i=0 ;i<list1.size();i++){
    for(int j =0 ;j< list2.size();j++){
        if(list1.get(i).getName().equals(list2.get(j).getName())){
                list1.get(i).setScholarship(list1.get(i).getScholarship().add(list2.get(j).getScholarship()));
                list1.get(i).setTotalGrade(list1.get(i).getTotalGrade().add(list2.get(j).getTotalGrade()));
        }
    } 
}

 

java8 stream

list1.stream().
        forEach(i -> list2.stream().anyMatch(a -> {
            boolean judge = false;
            if (a.getName().equals(i.getName())) {
                i.setScholarship(i.getScholarship().add(a.getScholarship()));  
                i.setTotalGrade(i.getTotalGrade().add(a.getTotalGrade()));
                judge = true; 
            }
            return judge;
        }));

 

这是我目前完成我需求的方式。。。。。。。。。。。。。。。。如果大神们有其他更好的方法,请在下方评论区留下方法。

以下是对你提供的代码片段的优化建议,旨在提高代码可读性和性能。 --- ### 已知问题分析 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. **返回结果封装一致性检查** 如果存在找不到符合条件的情况也不会影响最终输出完整性;同时保持原有函数签名不变方便上下游对接工作继续沿用当前规范。 --- ### 测试与验证 为了确保改动无误,应该针对边界条件进行全面测试: - 输入为空或仅有少量元素的情况下是否正常退出; - 存在一个及以上有效关联关系时能否成功绑定得分记录; - 全部均为无效链接情形下确认不会抛异常也返回空集合即可。 此外还可以借助单元测验框架编写自动化脚本快速定位潜在缺陷区域加以修复完善直至满足预期目标为止! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值