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

如何过滤删除嵌套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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 22:27:01