You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Stream改写修改循环计数器的学生列表删除代码(SonarQube问题)

解决方案:用Stream替代循环移除匹配学生

问题背景

原循环代码里的i--操作触发了SonarQube的「请勿在循环体内为循环计数器赋值」警告,而且这种直接操作索引的方式容易引发索引越界问题。需求是移除所有与removedStudent匹配的项(姓名或护照号一致即可),但要保留其他重复的学生——不能用HashSet,因为它会把所有重复项都删掉,不符合要求。

代码改造实现

第一步:提取匹配判断逻辑

先把原循环里的两个匹配条件整合成一个独立方法,避免重复代码,也让逻辑更清晰:

private boolean isMatching(Student target, Student removedStudent) {
    // 姓名匹配判断
    boolean nameMatch = removedStudent.getNameAndSurname() != null
            && target.getNameAndSurname() != null
            && removedStudent.getNameAndSurname().equals(target.getNameAndSurname());
    
    // 护照号匹配判断
    boolean passportMatch = removedStudent.getPassportId() != null
            && target.getPassportId() != null
            && removedStudent.getPassportId().equals(target.getPassportId());
    
    // 满足任一条件即判定为匹配
    return nameMatch || passportMatch;
}

第二步:用Stream过滤生成新列表

利用Stream的filter方法直接过滤掉匹配的元素,生成符合要求的新列表,彻底摆脱循环计数器的问题:

// 过滤掉所有匹配的学生,保留其他元素(包括重复项)
List<Student> filteredList = listOfAllStudents.stream()
        .filter(student -> !isMatching(student, removedStudent))
        .collect(Collectors.toList());

如果需要直接修改原列表而不是生成新列表,可以追加以下代码:

listOfAllStudents.clear();
listOfAllStudents.addAll(filteredList);

方案优势

  • 彻底解决SonarQube的警告,没有任何循环计数器操作;
  • 代码逻辑更直观,可读性更强;
  • 严格符合需求:只移除和指定学生匹配的项,其他重复学生全部保留,不会像HashSet一样全局去重。

内容的提问来源于stack exchange,提问作者IndexOutOfDevelopersException

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 18:42:47