本文已参与「新人创作礼」活动,一起开启掘金创作之路。
代码
- 基础的类,使用的可以继承该类补充其他数据
import lombok.Data;
import java.util.List;
/**
* @description: 树状数据BaseEntity
* @author: Mr.Kusch
* @create: 2022-03-17 15:22
**/
@Data
public class TreeBaseEntity {
private int id;
private int parentId;
private String label;
private List<? extends TreeBaseEntity> children;
}
- 工具类
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @description: 构造树工具类
* @author: Mr.kusch
* @create: 2022-03-17 15:26
**/
public class TreeUtil {
/**
* 转树工具类
*
* @param originData 原数据
* @param startOriginValue 第一级数据的父id值,一般推荐最上级父ID是0
* @return java.util.List<? extends com.kusch.ares.tree.TreeBaseEntity>
* @author Mr.kusch
* @date 2022/3/17 15:34
*/
public static List<? extends TreeBaseEntity> generateTree(List<? extends TreeBaseEntity> originData,
Integer startOriginValue) {
//过滤出不是一级的数据,并按照parentId进行构造一个map
Map<Integer, ? extends List<? extends TreeBaseEntity>> childMap =
originData.stream().filter(node -> node.getParentId() != startOriginValue)
.collect(Collectors.groupingBy(TreeBaseEntity::getParentId));
//便利originData将子数据设置进去,利用了对象之间的浅拷贝
originData.forEach(item -> item.setChildren(childMap.get(item.getId())));
//过滤出父id是0的数据返回
return originData.stream().filter(item -> item.getParentId() == startOriginValue).collect(Collectors.toList());
}
}
使用
- 继承基础类
/**
* @description: 我的树
* @author: Mr.kusch
* @create: 2022-03-17 15:38
**/
@Data
public class MyTree extends TreeBaseEntity {
private String name;
private String gender;
}
- 测试
import cn.hutool.json.JSONUtil;
import com.kusch.ares.tree.TreeUtil;
import java.util.ArrayList;
import java.util.List;
/**
* @description: 测试
* @author: Mr.kusch
* @create: 2022-03-17 15:38
**/
public class Test {
public static void main(String[] args) {
List<MyTree> list = new ArrayList<>();
MyTree myTree1 = new MyTree();
myTree1.setId(1);
myTree1.setParentId(0);
myTree1.setLabel("第一");
myTree1.setName("张祖宗");
myTree1.setGender("男");
list.add(myTree1);
MyTree myTree2 = new MyTree();
myTree2.setId(2);
myTree2.setParentId(1);
myTree2.setLabel("第一一");
myTree2.setName("张祖宗下");
myTree2.setGender("男");
list.add(myTree2);
MyTree myTree3 = new MyTree();
myTree3.setId(3);
myTree3.setParentId(2);
myTree3.setLabel("第一一一");
myTree3.setName("张祖宗下下");
myTree3.setGender("男");
list.add(myTree3);
MyTree myTree4 = new MyTree();
myTree4.setId(4);
myTree4.setParentId(3);
myTree4.setLabel("第一一一一");
myTree4.setName("张祖宗下下下");
myTree4.setGender("男");
list.add(myTree4);
MyTree myTree5 = new MyTree();
myTree5.setId(5);
myTree5.setParentId(0);
myTree5.setLabel("第二");
myTree5.setName("谷祖宗");
myTree5.setGender("女");
list.add(myTree5);
MyTree myTree6 = new MyTree();
myTree6.setId(6);
myTree6.setParentId(5);
myTree6.setLabel("第二二");
myTree6.setName("谷祖宗下");
myTree6.setGender("女");
list.add(myTree6);
System.out.println(JSONUtil.toJsonStr(TreeUtil.generateTree(list,0)));
}
}
- 输出结果
[ { "gender": "男", "label": "第一", "parentId": 0, "children": [ { "gender": "男", "label": "第一一", "parentId": 1, "children": [ { "gender": "男", "label": "第一一一", "parentId": 2, "children": [ { "gender": "男", "label": "第一一一一", "parentId": 3, "name": "张祖宗下下下", "id": 4 } ],
"name": "张祖宗下下",
"id": 3
}
],
"name": "张祖宗下",
"id": 2
}
],
"name": "张祖宗",
"id": 1
},
{
"gender": "女",
"label": "第二",
"parentId": 0,
"children": [
{
"gender": "女",
"label": "第二二",
"parentId": 5,
"name": "谷祖宗下",
"id": 6
}
],
"name": "谷祖宗",
"id": 5
}
]