在开发中,我们通常需要将从数据库中查询的集合数据转换成类似文件系统一样的树形集合。本文将利用Java语言实现这一功能,感兴趣的可以了解一下
在开发中,我们通常需要将从数据库中查询的集合数据转换成类似文件系统一样的树形集合,比如:省市单位,部门机构,书籍分类等
TreeNode对象
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TreeNode {
/**
* 节点内码
*/
private Long id;
/**
* 节点名称
*/
private String label;
/**
* 父节点内码
*/
private Long pid;
/**
* 子节点集合
*/
private List<TreeNode> children;
}
转换工具类
方式一:foreach遍历
对所传递的treeList进行遍历,然后判断该节点的父id与传递的id是否相同,相同则递归设置其孩子节点,并将该节点的放入children集合中,用于统一返回父节点相同的所有TreeNode对象。
方式二:stream流
基于filter()实现数据过滤
该方法会接收一个返回boolean的函数作为参数,终返回一个包括所有符合条件元素的流。
基于map()对元素进行转换
它接收一个函数作为方法参数,这个函数会被应用到集合中每一个 元素上,并终将其映射为一个新的元素。
对集合中的元素进行过滤,通过filter将父id相同的所有节点过滤出来,然后在map中递归设置其孩子节点,并返回。
public class List2TreeList {
//方式一: 使用foreach转换
public static List<TreeNode> buildTreeUseList(List<TreeNode> treeList,long id){
//收集传递的集合中父id相同的TreeNode
List<TreeNode> 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<TreeNode> buildTreeUseStream(List<TreeNode> treeList,long id){
List<TreeNode> 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<TreeNode> convert2Tree(){
List<TreeNode> 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<TreeNode> treeList = List2TreeList.buildTreeUseList(list, 0l);
System.out.println(treeList);
return treeList;
}
}
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": []
}
]
}
]
到此这篇关于Java实现List集合转树形结构的示例详解的文章就介绍到这了,更多相关Java List转树形结构内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!
本文标题为:Java实现List集合转树形结构的示例详解
基础教程推荐
- Java并发编程进阶之线程控制篇 2023-03-07
- Java数据结构之对象比较详解 2023-03-07
- JDK数组阻塞队列源码深入分析总结 2023-04-18
- Java实现线程插队的示例代码 2022-09-03
- java基础知识之FileInputStream流的使用 2023-08-11
- java实现多人聊天系统 2023-05-19
- Java实现查找文件和替换文件内容 2023-04-06
- ConditionalOnProperty配置swagger不生效问题及解决 2023-01-02
- Java文件管理操作的知识点整理 2023-05-19
- springboot自定义starter方法及注解实例 2023-03-31