Java数据封装成树形结构,多级

参考地址:https://blog.csdn.net/chendu500qiang/article/details/91493147

1、实体类

@data
public class PublishServiceType  implements Comparable<PublishServiceType>{


    /**
     * 
     */
    private static final long serialVersionUID = -3572108154932898825L;


    /* 
     * @see {code}
     * @comment 类型标识
     */
    private String code;
    /* 
     * @see {createtime}
     * @comment 创建时间
     */
    private java.util.Date createtime;
    /* 
     * @see {defaultmanual}
     * @comment 服务类型默认使用手册
     */
    private String defaultmanual;
    /* 
     * @see {description}
     * @comment 服务类型描述
     */
    private String description;
    /* 
     * @see {id}
     * @comment 主键
     */
    private String id;
    /* 
     * @see {isdelete}
     * @comment 是否可以删除
     */
    private Integer isdelete;
    /* 
     * @see {lastmodifytime}
     * @comment 最近修改时间
     */
    private java.util.Date lastmodifytime;
    /* 
     * @see {name}
     * @comment 服务类型名称
     */
    private String name;
    /* 
     * @see {parentid}
     * @comment 服务类型父节点
     */
    private String parentid;

    /**
     * 排序
     */
    private Integer sort;

    private List<PublishServiceType>children;
}

2、数据封装

 @Override
    public List<PublishServiceType> findList(String name) {
        List<PublishServiceType>list = publishServiceTypeMapper.findByName(name);
        if (JudgeUtil.isEmpty(list)){
            return null;
        }
        //父子级组装
        return  parentAndChildren(list);
    }
 private List<PublishServiceType>parentAndChildren(List<PublishServiceType> list){

        //最顶层根节点
        List<PublishServiceType>rootList = new ArrayList<>();
        //非最顶层根节点
        List<PublishServiceType>bodyList = new ArrayList<>();
        for (PublishServiceType publishServiceType : list) {
            if (StringUtils.isBlank(publishServiceType.getParentid())){
                rootList.add(publishServiceType);
            }else{
                bodyList.add(publishServiceType);
            }
        }
        return getTree(rootList,bodyList);
    }

    public List<PublishServiceType> getTree(List<PublishServiceType>rootList, List<PublishServiceType>bodyList){
        if (!JudgeUtil.isEmpty(bodyList)){
            //声明一个map,用来过滤已操作过的数据
            Map<String,String> map = new HashMap<>(bodyList.size());
            rootList.forEach(parent->getChild(parent,bodyList,map));
            return rootList;
        }else{
            return rootList;
        }
    }

    private void getChild(PublishServiceType parent,List<PublishServiceType>bodyList, Map<String,String> map){
       List<PublishServiceType>childList = new ArrayList<>();
        bodyList.stream().filter(c->!map.containsKey(c.getId()))
                         .filter(c->c.getParentid().equals(parent.getId()))
                         .forEach(c->{
                             map.put(c.getId(),c.getParentid());
                             getChild(c,bodyList,map);
                             childList.add(c);
                         });
        
        parent.setChildren(childList);
    }

3、结果

 1 {
 2   "code": 20000,
 3   "message": "成功",
 4   "data": [
 5     {
 6       "code": null,
 7       "createtime": null,
 8       "defaultmanual": null,
 9       "description": null,
10       "id": "dc1d70b9eb7b4df3bbe8dcc6a93cbd57",
11       "isdelete": -1,
12       "lastmodifytime": null,
13       "name": "基础服务",
14       "parentid": "",
15       "sort": 1,
16       "children": [
17         {
18           "code": null,
19           "createtime": null,
20           "defaultmanual": null,
21           "description": null,
22           "id": "b1779671ef1b45e0a9a8a1edbff03f1e",
23           "isdelete": -1,
24           "lastmodifytime": null,
25           "name": "数据源服务",
26           "parentid": "dc1d70b9eb7b4df3bbe8dcc6a93cbd57",
27           "sort": 2,
28           "children": [
29             {
30               "code": null,
31               "createtime": null,
32               "defaultmanual": null,
33               "description": null,
34               "id": "2a38a8254ec348e9b54c9bf4622f23db",
35               "isdelete": 1,
36               "lastmodifytime": null,
37               "name": "测试添加数据库服务2",
38               "parentid": "b1779671ef1b45e0a9a8a1edbff03f1e",
39               "sort": null,
40               "children": []
41             }
42           ]
43         },
44         {
45           "code": null,
46           "createtime": null,
47           "defaultmanual": null,
48           "description": null,
49           "id": "d4f3b047dc2d467a9b404ded8acf4673",
50           "isdelete": 1,
51           "lastmodifytime": null,
52           "name": "text_lsa",
53           "parentid": "dc1d70b9eb7b4df3bbe8dcc6a93cbd57",
54           "sort": null,
55           "children": []
56         }
57       ]
58     },
59     {
60       "code": null,
61       "createtime": null,
62       "defaultmanual": null,
63       "description": null,
64       "id": "af1b4a4d2f074fa19e1dae0a5540a5bf",
65       "isdelete": 1,
66       "lastmodifytime": null,
67       "name": "测试添加1",
68       "parentid": "",
69       "sort": null,
70       "children": []
71     },
72     {
73       "code": null,
74       "createtime": null,
75       "defaultmanual": null,
76       "description": null,
77       "id": "62e15d859a224126884888a55df355a7",
78       "isdelete": 1,
79       "lastmodifytime": null,
80       "name": "测试添加2",
81       "parentid": "",
82       "sort": null,
83       "children": []
84     }
85   ]
86 }
View Code
原文地址:https://www.cnblogs.com/cq-yangzhou/p/12023949.html