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

如何为Java多级目录类目类实现递归获取全量产品的方法

多级类目递归获取全量商品的实现方案

正确的实现思路是依托现有继承体系的多态特性,替代在递归逻辑中硬做类型判断的写法,既减少类型强转的风险,也能让代码结构更易扩展。

核心实现步骤

  • 在顶层父类Group中定义统一的递归取数方法,作为所有类目节点的通用能力
  • 每个子类根据自身的存储结构,分别实现对应取数逻辑,不需要在主递归方法中判断节点类型

1. 父类结构调整

如果允许修改类定义,优先把取数方法定义为抽象方法,强制所有子类实现,避免漏写逻辑:

abstract class Group { 
    int id; 
    String name; 

    /**
     * 递归获取当前类目节点下的所有商品
     */
    public abstract List<Product> getAllProducts();
}

如果现有代码不方便将Group改为抽象类,可以给基类加一个默认空实现,兼容现有结构:

class Group { 
    int id; 
    String name; 

    public List<Product> getAllProducts() {
        // 基类默认无关联商品,返回空集合
        return new ArrayList<>();
    }
}

2. 子类实现各自的取数逻辑

  • 叶子节点LeafGroup本身直接持有商品列表,没有下层子结构,直接返回自身的商品集合即可:

    class LeafGroup extends Group { 
        List<Product> products;
    
        @Override
        public List<Product> getAllProducts() {
            // 空值兼容:商品列表为null时返回空集合
            if (products == null) {
                return new ArrayList<>();
            }
            return new ArrayList<>(products);
        }
    }
    
  • 非叶子节点SubGroup持有下层子类目列表,遍历每个子节点,递归调用子节点的取数方法,汇总所有结果即可:

    class SubGroup extends Group { 
        List<Group> subgroups;
    
        @Override
        public List<Product> getAllProducts() {
            List<Product> totalProducts = new ArrayList<>();
            // 空值兼容:子类目列表为null时直接返回空集合
            if (subgroups == null) {
                return totalProducts;
            }
            // 遍历所有子层级,递归收集商品
            for (Group subNode : subgroups) {
                totalProducts.addAll(subNode.getAllProducts());
            }
            return totalProducts;
        }
    }
    

方案说明

这种写法相比最初设想的“在方法里判断当前节点是否持有商品、不存在就递归”的思路,优势在于:

  • 不需要做instanceof类型判断和强制类型转换,从根源上避免类型转换异常
  • 后续如果新增其他类目节点类型(比如加一个有独立商品集合的特殊分组),只需要新增类并重写getAllProducts()方法,不需要修改已有的递归逻辑,符合开闭原则
  • 调用方式完全统一:不管是顶层大类、中间子分组还是叶子节点,直接调用getAllProducts()就能拿到节点下的全部商品,比如示例中的二级子分组Subgroup2,调用后会自动递归遍历下层的2.1、2.2两个子分组,最终汇总到2.1节点下的所有商品,完全匹配需求。

落地注意点

  • 所有取数逻辑都要加空值判断,避免子类目、商品列表为null时抛出空指针
  • 如果后续需要过滤不可用商品,只需要在统一的取数方法里加过滤规则,不需要在每个子类重复实现
  • 如果类目层级特别深(超过千级),可以后续考虑改成栈实现的非递归遍历,避免递归栈溢出的问题,常规电商类目层级下递归完全够用。

内容的提问来源于stack exchange,提问作者Java

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 06:36:03