如何用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
相关产品推荐
相关产品推荐

