自定义树形构造器

叶子节点

java 复制代码
import java.util.List;

/**
 * TODO
 *
 * @author libinWang
 * @className TreeNode
 * @date 2025/8/25
 */
public interface TreeNode<K> {
    K getId();
    K getParentId();
    List<? extends TreeNode<K>> getChildren();
    void setChildren(List<? extends TreeNode<K>> children);

}

构造器

javascript 复制代码
import java.util.*;

public class TreeBuilder {

    /**
     * 通用树形结构构建方法(适用于实现了TreeNode接口的类)
     * @param list 原始数据列表
     * @param <T> 节点类型
     * @param <K> ID类型
     * @return 树形结构列表
     */
    public static <T extends TreeNode<K>, K> List<T> buildTree(List<T> list) {
        if (list == null || list.isEmpty()) {
            return Collections.emptyList();
        }

        Map<K, T> map = new HashMap<>();
        for (T item : list) {
            map.put(item.getId(), item);
        }

        List<T> roots = new ArrayList<>();
        for (T item : list) {
            T parent = map.get(item.getParentId());
            if (parent == null) {
                roots.add(item);
            } else {
                List<T> children = (List<T>) parent.getChildren();
                if (children == null) {
                    children = new ArrayList<>();
                    parent.setChildren(children);
                }
                children.add(item);
            }
        }

        return roots;
    }
}

使用

java 复制代码
@Data
public class DeptVo implements TreeNode {

    /**
     * id
     */
    @JsonSerialize(using = ToStringSerializer.class)
    private Long id;

    /**
     * 父级ID(指向本表id,根节点为NULL)
     */
    private Long parentId;

    /**
     * 子集
     */
    private List<DeptVo> deptVoList; 


    @Override
    public List<? extends TreeNode> getChildren() {
        return this.getDeptVoList();
    }

    @Override
    public void setChildren(List children) {
       this.setDeptVoList(children);
    }
}
java 复制代码
 List<PostVo> copys= TreeBuilder.buildTree(copys);