不合理使用循环遍历删除List中的元素,导致业务功能不正确
一、问题描述:
直接上错误实例代码:
private void remove(List<数据对象> tempData) {
if (ArrayUtils.isNotEmpty(tempData)) {
for (int i = 0; i < 待删除的list集合.size(); i++) {
for (int j = 0; j < tempData.size(); j++) {
if (待删除的list集合.get(i).getId().equals(tempData.get(j).getId())) {
tempData.remove(j);
totalNum--;
}
}
}
}
}
错误说明:通过index遍历List删除元素,部分元素实际未被遍历,导致功能异常
正确的代码:
private void remove(List<数据对象> tempData) {
if (ArrayUtils.isEmpty(tempData)) {
return;
}
tempData.removeIf(item -> 待删除的list集合
.stream()
.anyMatch(delItem -> StringUtils.isEqual(delItem.getId(), item.getId())));
}
问题总结:
遍历集合的过程中应避免对集合对象的大小进行修改,否则功能会有异常;如果对内容进行修改,可能还会触发fail-fast,抛出异常。推荐使用Iterator或java8中的filter/removeIf等方法进行操作。

浙公网安备 33010602011771号