@Data
@AllArgsConstructor
@NoArgsConstructor
public class TreeNode {
/**
* 节点内码
*/
private Long id;
/**
* 节点名称
*/
private String label;
/**
* 父节点内码
*/
private Long pid;
/**
* 子节点集合
*/
private List children;
}
方式一:foreach遍历
对所传递的treeList进行遍历,然后判断该节点的父id与传递的id是否相同,相同则递归设置其孩子节点,并将该节点的放入children集合中,用于统一返回父节点相同的所有TreeNode对象。
方式二:stream流
基于filter()实现数据过滤
该方法会接收一个返回boolean的函数作为参数,终返回一个包括所有符合条件元素的流。
基于map()对元素进行转换
它接收一个函数作为方法参数,这个函数会被应用到集合中每一个 元素上,并终将其映射为一个新的元素。
对集合中的元素进行过滤,通过filter将父id相同的所有节点过滤出来,然后在map中递归设置其孩子节点,并返回。
public class List2TreeList {
//方式一: 使用foreach转换
public static List buildTreeUseList(List treeList,long id){
//收集传递的集合中父id相同的TreeNode
List children = new ArrayList<>();
for (TreeNode treeNode : treeList) {
//判断该节点的父id,是否与传入的父id相同,相同则递归设置其孩子节点,并将该节点放入children集合中
if(treeNode.getPid() == id){
//递归设置其孩子节点
treeNode.setChildren(buildTreeUseList(treeList, treeNode.getId()));
//放入children集合
children.add(treeNode);
}
}
return children;
}
//方式二: 使用stream流转换
public static List buildTreeUseStream(List treeList,long id){
List list = treeList.stream()
//过滤父节点与传递的id相同的TreeNode对象
.filter( treeNode -> treeNode.getPid().longValue() == id )
.map( treeNode -> {
//递归设置孩子节点
treeNode.setChildren(buildTreeUseStream(treeList,treeNode.getId()));
return treeNode;
})
.collect(Collectors.toList());
return list;
}
}
传入集合数据及最高节点的父id进行转换
@RestController
public class TestController {
@GetMapping("/treeList")
public List convert2Tree(){
List list = new ArrayList<>();
list.add(new TreeNode(370000l,"山东省",0l,null));
list.add(new TreeNode(370100l,"济南市",370000l,null));
list.add(new TreeNode(370200l,"青岛市",370000l,null));
list.add(new TreeNode(370300l,"淄博市",370000l,null));
list.add(new TreeNode(371300l,"临沂市",370000l,null));
list.add(new TreeNode(370102l,"历下区",370100l,null));
list.add(new TreeNode(370103l,"市中区",370100l,null));
list.add(new TreeNode(370202l,"市南区",370200l,null));
//使用list转换
List treeList = List2TreeList.buildTreeUseList(list, 0l);
System.out.println(treeList);
return treeList;
}
}
转换后的集合数据格式
[
{
"id": 370000,
"label": "山东省",
"pid": 0,
"children": [
{
"id": 370100,
"label": "济南市",
"pid": 370000,
"children": [
{
"id": 370102,
"label": "历下区",
"pid": 370100,
"children": []
},
{
"id": 370103,
"label": "市中区",
"pid": 370100,
"children": []
}
]
},
{
"id": 370200,
"label": "青岛市",
"pid": 370000,
"children": [
{
"id": 370202,
"label": "市南区",
"pid": 370200,
"children": []
}
]
},
{
"id": 370300,
"label": "淄博市",
"pid": 370000,
"children": []
},
{
"id": 371300,
"label": "临沂市",
"pid": 370000,
"children": []
}
]
}
]