如何过滤删除嵌套CategoryModel列表中的空分类,解决遍历删除不支持操作报错
问题根因
你遇到的UnsupportedOperationException主要来自两个常见场景:
- 你传入的
List<CategoryModel>本身是不可变集合实例:比如通过Arrays.asList()、第三方框架返回的只读集合、Guava的ImmutableList等创建的列表,本身就不支持add/remove操作 - 即使列表是可变的,你在增强for循环(foreach)中直接调用列表的remove方法,会触发快速失败机制抛出
ConcurrentModificationException,就算当前没抛,也存在遍历遗漏的问题
另外你的原有递归逻辑顺序有问题:需要先处理子分类的空节点清理,再判断当前分类是否符合删除条件,否则会出现子分类全部被删空后,父分类变成空分类但没有被识别删除的情况。
修复方案
第一步:保证所有分类列表是可变集合
如果你的CategoryModel里的categories属性初始化用的是不可变集合,要改成可变实现,比如初始化时用new ArrayList<>()存储子分类。如果入参是不可变集合,可以先转成可变集合再处理:List<CategoryModel> mutableList = new ArrayList<>(originImmutableList);
第二步:调整递归删除逻辑
用JDK8+自带的removeIf方法执行安全删除,避免遍历过程修改列表的异常,同时调整递归顺序先处理子分类再处理当前层级。
修正后代码
private void checkNullCategory(List<CategoryModel> categoryModelList) { if (Objects.isNull(categoryModelList) || categoryModelList.isEmpty()) { return; } // 先递归处理所有子分类的空节点清理 for (CategoryModel categoryModel : categoryModelList) { checkNullCategory(categoryModel.getCategories()); } // 子分类处理完毕后,删除当前层级的空分类:既没有关联产品,子分类也已被删空 categoryModelList.removeIf(categoryModel -> { boolean isNullCategory = categoryModel.getProducts().isEmpty() && categoryModel.getCategories().isEmpty(); if (isNullCategory) { categoryCode.add(categoryModel.getCode()); } return isNullCategory; }); }
内容的提问来源于stack exchange,提问作者Arkaplan86
相关产品推荐
相关产品推荐

