Spring boot树状数据工具类

2023年09月23日

在实际项目开发中,例如构造菜单,组织架构的数据的时候经常会需要返回树状的层级数据,解决这个问题,可以通过构造SQL语句或者递归来进行构造,我个人推荐使用第二种。

参考代码如下:

假设数据表的使用的 parentId 这个字段进行父子级关联。

VO


@Data
@EqualsAndHashCode(callSuper = false)
@ApiModel(description = "reeVO")
public class TreeVO {
 
    @ApiModelProperty(value = "主键id")
    private long id;
 
    @ApiModelProperty(value = "父id")
    private long parentId;
 
    @ApiModelProperty(value = "子节点")
    private List<TreeVO> children = new ArrayList<>();
 
}

工具类

public class TreeUtil {
 
    /**
    * 根据pid,构建树节点
    */
    public static <T extends TreeVo> List<T> build(List<T> treeNodes, Integer pid) {
 
      List<T> treeList = new ArrayList<>();
      for(T treeNode : treeNodes) {
        if (pid.equals(treeNode.getParentId())) {
          treeList.add(findChildren(treeNodes, treeNode));
        }
      }
        return treeList;
    }
 
    /**
    * 查找子节点
    */
    private static <T extends TreeVo> T findChildren(List<T> treeNodes, T rootNode) {
      for(T treeNode : treeNodes) {
        if(rootNode.getId().equals(treeNode.getParentId())) {
          rootNode.getChildren().add(findChildren(treeNodes, treeNode));
        }
      }
      return rootNode;
    }
 
    /**
    * 构建树节点
    */
    public static <T extends TreeVo> List<T> build(List<T> treeNodes) {
      List<T> result = new ArrayList<>();
      //list转map
      Map<BigInteger, T> nodeMap = new LinkedHashMap<>(treeNodes.size());
      for(T treeNode : treeNodes){
        nodeMap.put(treeNode.getId(), treeNode);
      }
      for(T node : nodeMap.values()) {
        T parent = nodeMap.get(node.getParentId());
          if(parent != null && !(node.getId().equals(parent.getId()))){
            parent.getChildren().add(node);
            continue;
            }
 
          result.add(node);
          }
        return result;
       }
    }

© 1987 - 2023 张晓刚 版权所有

浙ICP备16002143号-1