首页 > 技术文章 > 不合理使用循环遍历删除List中的元素,导致业务功能不正确

irvin-chen 2021-01-05 15:38 原文

一、问题描述:

    直接上错误实例代码:

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等方法进行操作。

推荐阅读