Java实现List集合转树形结构的示例详解

 更新时间:2022年08月18日 09:08:43   作者:Zz要变强  
在开发中,我们通常需要将从数据库中查询的集合数据转换成类似文件系统一样的树形集合。本文将利用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中的tostring方法的具体用法

    java中的tostring方法的具体用法

    这篇文章主要介绍了java中的tostring方法的具体用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,下面我们来一起学习一下吧
    2019-06-06
  • Java通过接口实现匿名类的实例代码

    Java通过接口实现匿名类的实例代码

    这篇文章介绍了Java通过接口实现匿名类的实例代码,有需要的朋友可以参考一下
    2013-10-10
  • Spring应用抛出NoUniqueBeanDefinitionException异常的解决方案

    Spring应用抛出NoUniqueBeanDefinitionException异常的解决方案

    这篇文章介绍了解决org.springframework.beans.factory.NoUniqueBeanDefinitionException异常的一些解决方案,从这些解决方案可以看出Spring框架的设计精妙,遇见此问题的朋友可以参考下该解决方案
    2021-06-06
  • 使用springboot开发的第一个web入门程序的实现

    使用springboot开发的第一个web入门程序的实现

    这篇文章主要介绍了使用springboot开发的第一个web入门程序的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • java使用xstream实现xml文件和对象之间的相互转换

    java使用xstream实现xml文件和对象之间的相互转换

    xml是一个用途比较广泛的文件类型,在java里也自带解析xml的包,但是本文使用的是xstream来实现xml和对象之间的相互转换,xstream是一个第三方开源框架,使用起来比较方便,对java xml和对象转换相关知识感兴趣的朋友一起看看吧
    2023-09-09
  • SpringBoot集成Kafka的步骤

    SpringBoot集成Kafka的步骤

    这篇文章主要介绍了SpringBoot集成Kafka的步骤,帮助大家更好的理解和使用SpringBoot,感兴趣的朋友可以了解下
    2021-01-01
  • Java File类的详解及简单实例

    Java File类的详解及简单实例

    这篇文章主要介绍了Java File类的详解及简单实例的相关资料,希望通过本文大家能够掌握这部分内容,需要的朋友可以参考下
    2017-09-09
  • springboot使用log4j2异步日志提升性能的实现方式

    springboot使用log4j2异步日志提升性能的实现方式

    这篇文章主要介绍了springboot使用log4j2异步日志提升性能,异步日志实现方式:将日志存入一个单独的队列中,有一个单独的线程从队列中获取日志并写入磁盘文件,需要的朋友可以参考下
    2022-05-05
  • 将字符串数字格式化为样式1,000,000,000的方法

    将字符串数字格式化为样式1,000,000,000的方法

    这篇文章主要介绍了将字符串数字格式化为样式1,000,000,000的方法,有需要的朋友可以参考一下
    2014-01-01
  • Java中IdentityHashMap与HashMap区别详解

    Java中IdentityHashMap与HashMap区别详解

    这篇文章主要介绍了Java中IdentityHashMap与HashMap区别详解,很多人不晓得IdentityHashMap的存在,其中不乏工作很多年的Java开发者,他们看到就说是第三方jar包,实际上它是Jdk源码自带的集合类,需要的朋友可以参考下
    2023-11-11

最新评论