如何为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
相关产品推荐
相关产品推荐

