Java实现List集合转树形结构的示例详解
作者:Zz要变强 发布时间:2021-11-11 10:48:33
标签:Java,List,集合,树形,结构
在开发中,我们通常需要将从数据库中查询的集合数据转换成类似文件系统一样的树形集合,比如:省市单位,部门机构,书籍分类等
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": []
}
]
}
]
来源:https://blog.csdn.net/m0_48420795/article/details/126391100


猜你喜欢
- 前言Spring内置的工具类里,最喜欢用的就是文件读写这一部分,虽然原生的写法也没几句,但是就是懒,不想循环、判断什么的,直接调用现成的静态
- 一.引言相信现在有很多小伙伴都已经很熟悉SpringBoot技术了。它大大地简化了Spring应用的开发,极大地提高了项目的开发效率,受到广
- package com.cq2022.zago.base.util;import java.io.FileReader;import jav
- 本文是项目中使用了websocket进行一些数据的推送,对比项目做了一个demo,ws的相关问题不做细数,仅做一下记录。此demo针对ws的
- 1.类加载机制Java中的源码.java后缀文件会在运行前被编译成.class后缀文件,文件内的字节码的本质就是一个字节数组 ,它有特定的复
- 前言很久没有写关于 Spring 的文章了,最近在系统梳理 Dubbo 代码的过程中发现了 XML schema 这个被遗漏的知识点。由于工
- 自定义starter yaml提示失效问题问题场景在自定义starter后,必不可少会有properties配置参数需要指定,而在有时又不知
- 系列文章已完成,目录如下:commons-logging与jdk-logging、log4j1、log4j2、logback的集成原理slf
- 目录IntroSampleWhat insideMoreReferenceIntroC# 9 中引入了 record,record 是一个特
- springboot的最强大的就是那些xxxAutoconfiguration,但是这些xxxAutoConfiguration又依赖那些s
- 一. SpringBoot中实现Session共享1. 创建web项目我们按照之前的经验,创建一个web程序,并将之改造成Spring Bo
- 从什么是IOC开始?Spring——春天,Java编程世界的春天是由一位音乐家—
- 前言镜像配置都是常规操作,必要时也可以上代理.自己搭的nexus本质也是一种镜像,可以代理maven中央仓库.各个仓库的测速,可以使用这个脚
- 在使用SpringBoot做接口访问如何做接口的限流,这里我们可以使用google的Guava包来实现,当然我们也可以自己实现限流,Guav
- SpringBoot是什么?SpringBoot是spring家族中微型框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。
- C#删除指定文件或文件夹public static string deleteOneFile(string fileFullPath) &n
- 圆形头像在我们的日常使用的app中很常见,因为圆形的头像比较美观.使用圆形图片的方法可能有我们直接将图片裁剪成圆形再在app中使用,还有就是
- [] 是针对特定类型、固定长度的。List 是针对特定类型、任意长度的。Array 是针对任意类型、固定长度的。ArrayList 是针对任
- 承蒙各位厚爱,我们一起每天进步一点点!(鼠标选中空白处查看答案)1、现有如下代码段:x = 2;while(x<n/2){x = 2*
- 前言String 类在Java中是很常用的类,很重要的类,在后续的学习中经常会用到,是后续学习的基础一、认识String1.JDK中的Str