树状结构转换工具类

发布于:2025-05-01 ⋅ 阅读:(32) ⋅ 点赞:(0)

项目中使用了很多树状结构,为了方便使用开发一个通用的工具类。

使用工具类的时候写一个类基础BaseNode,如果有个性化字段添加到类里面,然后就可以套用工具类。

工具类会将id和pid做关联返回一个树状结构的集合。

使用了hutool的工具包判空。

TreeUtil.java

import cn.hutool.core.util.ObjUtil;
import com.iccb.BaseNode;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class TreeUtil {

    public static <T extends BaseNode<T>> List<T> toTree(List<T> treeNodeList) {
        //数据按照pid分组
        Map<Long, List<T>> map = treeNodeList.stream().collect(Collectors.groupingBy(T :: getPid,LinkedHashMap::new,
                Collectors.toList()));
        //找出所有的根节点,pid=-1的为根节点
        List<T> areaList = map.get(-1L);
        if(ObjUtil.isEmpty(areaList)){
            return new ArrayList<>();
        }
        for (T areaVO : areaList) {
            forEach(map, areaVO);
        }
        return areaList;
    }

    private static  <T extends BaseNode<T>> void forEach(Map<Long, List<T>> collect, T areaVO) {
        List<T> nodeList = collect.get(areaVO.getId());
        if (collect.get(areaVO.getId()) == null) {
            return;
        }
        areaVO.setChildren(nodeList);
        for (T node : nodeList) {
            forEach(collect, node);
        }
    }

}

 BaseNode.java

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;

import java.io.Serializable;
import java.util.List;

/**
 * @author admin
 */
@Data
public class BaseNode<T> implements Serializable {

    private static final long serialVersionUID = 1L;

    @JsonFormat(shape = JsonFormat.Shape.STRING)
    private Long id;

    @JsonFormat(shape = JsonFormat.Shape.STRING)
    private Long pid;
    
    private String value;

    private List<T> children;
}

 使用范例

返回树状结构的地区数据

1)首先构建数据VO

@EqualsAndHashCode(callSuper = true)
@Data
public class AreaVO extends BaseNode<AreaVO> {

    private static final long serialVersionUID = 1L;

    private String areaCode;

    private String label;

    private String level;

    private String lnglat;

}

2)查询地区数据

List<Area> list = areaService.list();

3) 构建数据VO 或者 直接使用mapper查询用VO封装

List<AreaVO> collect = list.stream().map(i -> {
            AreaVO areaVO = BeanUtil.copyProperties(i, AreaVO.class);
            areaVO.setLabel(i.getAreaName());
            areaVO.setValue(String.valueOf(i.getId()));
            areaVO.setLevel(i.getAreaLevel());
            areaVO.setPid(i.getParentId());
            return areaVO;
}).collect(Collectors.toList());

4) 使用工具类构造数据结构

List<AreaVO> areaTree = TreeUtil.toTree(collect);

数据返回示例

{
  "code": 200,
  "msg": null,
  "data": [
    {
      "id": "4058069977868140544",
      "value": "4058069977868140544",
      "pid": "4058069977868148888",
      "children": [
        {
          "id": "4058069978245627904",
          "value": "4058069978245627904",
          "pid": "4058069977868140544",
          "children": [
            {
              "id": "4058069978530840576",
              "value": "4058069978530840576",
              "pid": "4058069978245627904",
              "children": null,
              "areaCode": "110101000000",
              "label": "东城区",
              "level": "3",
              "lnglat": null
            },
            {
              "id": "4058069978732167168",
              "value": "4058069978732167168",
              "pid": "4058069978245627904",
              "children": null,
              "areaCode": "110102000000",
              "label": "西城区",
              "level": "3",
              "lnglat": null
            },
            {
              "id": "4058069978874773504",
              "value": "4058069978874773504",
              "pid": "4058069978245627904",
              "children": null,
              "areaCode": "110105000000",
              "label": "朝阳区",
              "level": "3",
              "lnglat": null
            },
            {
              "id": "4058069978979631104",
              "value": "4058069978979631104",
              "pid": "4058069978245627904",
              "children": null,
              "areaCode": "110106000000",
              "label": "丰台区",
              "level": "3",
              "lnglat": null
            },
            {
              "id": "4058069979046739968",
              "value": "4058069979046739968",
              "pid": "4058069978245627904",
              "children": null,
              "areaCode": "110107000000",
              "label": "石景山区",
              "level": "3",
              "lnglat": null
            },
            {
              "id": "4058069979118043136",
              "value": "4058069979118043136",
              "pid": "4058069978245627904",
              "children": null,
              "areaCode": "110108000000",
              "label": "海淀区",
              "level": "3",
              "lnglat": null
            },
            {
              "id": "4058069979231289344",
              "value": "4058069979231289344",
              "pid": "4058069978245627904",
              "children": null,
              "areaCode": "110109000000",
              "label": "门头沟区",
              "level": "3",
              "lnglat": null
            },
            {
              "id": "4058069979336146944",
              "value": "4058069979336146944",
              "pid": "4058069978245627904",
              "children": null,
              "areaCode": "110111000000",
              "label": "房山区",
              "level": "3",
              "lnglat": null
            },
            {
              "id": "4058069979441004544",
              "value": "4058069979441004544",
              "pid": "4058069978245627904",
              "children": null,
              "areaCode": "110112000000",
              "label": "通州区",
              "level": "3",
              "lnglat": null
            },
            {
              "id": "4058069979550056448",
              "value": "4058069979550056448",
              "pid": "4058069978245627904",
              "children": null,
              "areaCode": "110113000000",
              "label": "顺义区",
              "level": "3",
              "lnglat": null
            },
            {
              "id": "4058069979650719744",
              "value": "4058069979650719744",
              "pid": "4058069978245627904",
              "children": null,
              "areaCode": "110114000000",
              "label": "昌平区",
              "level": "3",
              "lnglat": null
            },
            {
              "id": "4058069979747188736",
              "value": "4058069979747188736",
              "pid": "4058069978245627904",
              "children": null,
              "areaCode": "110115000000",
              "label": "大兴区",
              "level": "3",
              "lnglat": null
            },
            {
              "id": "4058069979852046336",
              "value": "4058069979852046336",
              "pid": "4058069978245627904",
              "children": null,
              "areaCode": "110116000000",
              "label": "怀柔区",
              "level": "3",
              "lnglat": null
            },
            {
              "id": "4058069979956903936",
              "value": "4058069979956903936",
              "pid": "4058069978245627904",
              "children": null,
              "areaCode": "110117000000",
              "label": "平谷区",
              "level": "3",
              "lnglat": null
            },
            {
              "id": "4058069980166619136",
              "value": "4058069980166619136",
              "pid": "4058069978245627904",
              "children": null,
              "areaCode": "110228000000",
              "label": "密云区",
              "level": "3",
              "lnglat": null
            },
            {
              "id": "4058069980284059648",
              "value": "4058069980284059648",
              "pid": "4058069978245627904",
              "children": null,
              "areaCode": "110229000000",
              "label": "延庆区",
              "level": "3",
              "lnglat": null
            }
          ],
          "areaCode": "110100000000",
          "label": "北京市",
          "level": "2",
          "lnglat": null
        }
      ],
      "areaCode": "110000000000",
      "label": "北京市",
      "level": "1",
      "lnglat": null
    },
    {
      "id": "4058069980422471680",
      "value": "4058069980422471680",
      "pid": "4058069977868148888",
      "children": [
        {
          "id": "4058069980527329280",
          "value": "4058069980527329280",
          "pid": "4058069980422471680",
          "children": [
            {
              "id": "4058069980627992576",
              "value": "4058069980627992576",
              "pid": "4058069980527329280",
              "children": null,
              "areaCode": "120101000000",
              "label": "和平区",
              "level": "3",
              "lnglat": null
            },
            {
              "id": "4058069980732850176",
              "value": "4058069980732850176",
              "pid": "4058069980527329280",
              "children": null,
              "areaCode": "120102000000",
              "label": "河东区",
              "level": "3",
              "lnglat": null
            },
            {
              "id": "4058069980841902080",
              "value": "4058069980841902080",
              "pid": "4058069980527329280",
              "children": null,
              "areaCode": "120103000000",
              "label": "河西区",
              "level": "3",
              "lnglat": null
            },
            {
              "id": "4058069980938371072",
              "value": "4058069980938371072",
              "pid": "4058069980527329280",
              "children": null,
              "areaCode": "120104000000",
              "label": "南开区",
              "level": "3",
              "lnglat": null
            },
            {
              "id": "4058069981043228672",
              "value": "4058069981043228672",
              "pid": "4058069980527329280",
              "children": null,
              "areaCode": "120105000000",
              "label": "河北区",
              "level": "3",
              "lnglat": null
            },
            {
              "id": "4058069981148086272",
              "value": "4058069981148086272",
              "pid": "4058069980527329280",
              "children": null,
              "areaCode": "120106000000",
              "label": "红桥区",
              "level": "3",
              "lnglat": null
            },
            {
              "id": "4058069981252943872",
              "value": "4058069981252943872",
              "pid": "4058069980527329280",
              "children": null,
              "areaCode": "120110000000",
              "label": "东丽区",
              "level": "3",
              "lnglat": null
            },
            {
              "id": "4058069981357801472",
              "value": "4058069981357801472",
              "pid": "4058069980527329280",
              "children": null,
              "areaCode": "120111000000",
              "label": "西青区",
              "level": "3",
              "lnglat": null
            },
            {
              "id": "4058069981475241984",
              "value": "4058069981475241984",
              "pid": "4058069980527329280",
              "children": null,
              "areaCode": "120112000000",
              "label": "津南区",
              "level": "3",
              "lnglat": null
            },
            {
              "id": "4058069981580099584",
              "value": "4058069981580099584",
              "pid": "4058069980527329280",
              "children": null,
              "areaCode": "120113000000",
              "label": "北辰区",
              "level": "3",
              "lnglat": null
            },
            {
              "id": "4058069981684957184",
              "value": "4058069981684957184",
              "pid": "4058069980527329280",
              "children": null,
              "areaCode": "120114000000",
              "label": "武清区",
              "level": "3",
              "lnglat": null
            },
            {
              "id": "4058069981789814784",
              "value": "4058069981789814784",
              "pid": "4058069980527329280",
              "children": null,
              "areaCode": "120115000000",
              "label": "宝坻区",
              "level": "3",
              "lnglat": null
            },
            {
              "id": "4058069981890478080",
              "value": "4058069981890478080",
              "pid": "4058069980527329280",
              "children": null,
              "areaCode": "120116000000",
              "label": "滨海新区",
              "level": "3",
              "lnglat": null
            },
            {
              "id": "4058069981986947072",
              "value": "4058069981986947072",
              "pid": "4058069980527329280",
              "children": null,
              "areaCode": "120117000000",
              "label": "宁河区",
              "level": "3",
              "lnglat": null
            },
            {
              "id": "4058069982087610368",
              "value": "4058069982087610368",
              "pid": "4058069980527329280",
              "children": null,
              "areaCode": "120118000000",
              "label": "静海区",
              "level": "3",
              "lnglat": null
            },
            {
              "id": "4058069982293131264",
              "value": "4058069982293131264",
              "pid": "4058069980527329280",
              "children": null,
              "areaCode": "120225000000",
              "label": "蓟州区",
              "level": "3",
              "lnglat": null
            }
          ],
          "areaCode": "120100000000",
          "label": "天津市",
          "level": "2",
          "lnglat": null
        }
      ],
      "areaCode": "120000000000",
      "label": "天津市",
      "level": "1",
      "lnglat": null
    },
    {
      "id": "4461100398823866368",
      "value": "4461100398823866368",
      "pid": "4058069977868148888",
      "children": [
        {
          "id": "4461100398974861312",
          "value": "4461100398974861312",
          "pid": "4461100398823866368",
          "children": null,
          "areaCode": "820100000000",
          "label": "澳门半岛",
          "level": "2",
          "lnglat": null
        },
        {
          "id": "4461100399113273344",
          "value": "4461100399113273344",
          "pid": "4461100398823866368",
          "children": null,
          "areaCode": "820200000000",
          "label": "离岛",
          "level": "2",
          "lnglat": null
        }
      ],
      "areaCode": "820000000000",
      "label": "澳门特别行政区",
      "level": "1",
      "lnglat": null
    }
  ]
}