iis服务器助手广告广告
返回顶部
首页 > 资讯 > 操作系统 >Java8利用stream流实现递归遍历树形结构
  • 750
分享到

Java8利用stream流实现递归遍历树形结构

javamysql 2023-08-30 17:08:41 750人浏览 泡泡鱼
摘要

利用stream流实现递归遍历树形结构 1. 什么是树形结构 下面用一张图片说明: 在这张表中,每条数据分别有自己的id和parentId,这些数据通过父与子不断连接,形成了一个树结构。 2. 如何通过stream流处理树形结构 我们最终

利用stream流实现递归遍历树形结构

1. 什么是树形结构

下面用一张图片说明:

在这张表中,每条数据分别有自己的id和parentId,这些数据通过父与子不断连接,形成了一个树结构。

2. 如何通过stream流处理树形结构

我们最终需要的结果是一个树形的JSON串,如下:

话不多说,直接上代码:

这是course_cateGory类,即数据库对应的vo:

这是CourseCategoryTreeDto类,即我们所需要的dto类:

service层代码实现如下:

@Service@Slf4jpublic class CourseCategoryServiceImpl implements CourseCategoryService {    @Autowired    private CourseCategoryMapper courseCategoryMapper;    @Override    public List<CourseCategoryTreeDto> queryTreenodes(String id) {    // 获取数据库中的数据,这里建议先排序一下,会快很多        List<CourseCategoryTreeDto> categoryTreeDtos = courseCategoryMapper.selectTreeNodes(id);        // 调用递归函数获取树形结构,并排除掉表中的根节点:m -> m.getParentid().equals("1")        List<CourseCategoryTreeDto> courseCategoryTreeDtos =                categoryTreeDtos.stream()                        .filter( m -> m.getParentid().equals("1"))                        .peek(m -> m.setChildrenTreeNodes(getChildrens(m, categoryTreeDtos)))                        .collect(Collectors.toList());        return courseCategoryTreeDtos;    }    // 递归函数 过滤拿到父节点为当前节点的节点,递归加入到当前节点的子节点中,再收集起来    private List<CourseCategoryTreeDto> getChildrens(CourseCategoryTreeDto root, List<CourseCategoryTreeDto> all){        List<CourseCategoryTreeDto> childrens = all.stream()                .filter( m -> Objects.equals(m.getParentid(), root.getId()))                // peek方法返回由该流的元素组成的流,并对每个元素执行所提供的 Consumer操作方法                // peek和foreach在功能上类似,但foreach执行完函数不做其他操作了,peek完还可以继续对stream进行其它操作            // 这篇文章解释的比较清晰:https://blog.csdn.net/VoisSurTonChemin/article/details/122378636                .peek(m -> m.setChildrenTreeNodes(getChildrens(m, all)))                .collect(Collectors.toList());        return childrens;    }}

当然,不用stream流我们也可以实现,如下:

@Service@Slf4jpublic class CourseCategoryServiceImpl implements CourseCategoryService {    @Autowired    private CourseCategoryMapper courseCategoryMapper;    @Override    public List<CourseCategoryTreeDto> queryTreeNodes(String id) {        // 获得根节点下所有子节点 注意 CourseCategoryTreeDto是CourseCategory的子类        // 这里获取的List实际上只是List罢了 并没有构建树形结构 需要下面的处理        List<CourseCategoryTreeDto> categoryTreeDtos = courseCategoryMapper.selectTreeNodes(id);        // 定义一个list作为最终返回的数据        List<CourseCategoryTreeDto> courseCategoryTreeDtos = new ArrayList<>();        // 为了方便找子节点的父节点,我们定义一个map来存        HashMap<String, CourseCategoryTreeDto> nodeMap = new HashMap<>();        // 将数据封装到list中,只包括了根节点的直接下属节点,即实现树形结构        categoryTreeDtos.stream().forEach(item -> {            // 存入hashmap中,当前节点的id和信息            nodeMap.put(item.getId(), item);            String parentId = item.getParentid();            // 如果当前节点的的父节点是传过来的节点时,即为根节点的子节点时,加入该节点            // 因为根节点为0,是定义的一个无关的节点,传过去的数据应该从根节点的叶子节点开始            if(parentId.equals(id)){                courseCategoryTreeDtos.add(item);            }            // 此处是获取该项item的父节点的ChildrenTreeNodes,将该项加入对应父节点的的ChildrenTreeNodes中            CourseCategoryTreeDto parentNode = nodeMap.get(parentId);            if(parentNode != null){                List childrenTreeNodes = parentNode.getChildrenTreeNodes();                if(childrenTreeNodes == null){                    parentNode.setChildrenTreeNodes(new ArrayList<CourseCategoryTreeDto>());                }                parentNode.getChildrenTreeNodes().add(item);            }        });    }}

参考文章:

  1. Java8新特性-使用Stream流递归实现遍历树形结构
    https://blog.csdn.net/qq_19244927/article/details/106481777
  2. 【Java 8 新特性】Java Stream通过peek()为每个元素提供消费函数
    https://blog.csdn.net/qq_31635851/article/details/111150978
  3. Java stream 中 peek() 的合理用法
    https://blog.csdn.net/VoisSurTonChemin/article/details/122378636

来源地址:https://blog.csdn.net/qq_51534363/article/details/128795991

--结束END--

本文标题: Java8利用stream流实现递归遍历树形结构

本文链接: https://www.lsjlt.com/news/383454.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java8利用stream流实现递归遍历树形结构
    利用stream流实现递归遍历树形结构 1. 什么是树形结构 下面用一张图片说明: 在这张表中,每条数据分别有自己的id和parentId,这些数据通过父与子不断连接,形成了一个树结构。 2. 如何通过stream流处理树形结构 我们最终...
    99+
    2023-08-30
    java mysql
  • PyQt5QTreeWidget树形结构递归遍历当前所有节点的实现
    目录QTreeWidget类中的常用方法QTreeWidgetItem类中的常用方法准备一个小demo这样的做法有什么好处和坏处?对比网上的方法QTreeWidget类中的常用方法 ...
    99+
    2022-11-12
  • PyQt5 QTreeWidget树形结构递归遍历当前所有节点的实现方法是什么
    这篇文章主要介绍“PyQt5 QTreeWidget树形结构递归遍历当前所有节点的实现方法是什么”,在日常操作中,相信很多人在PyQt5 QTreeWidget树形结构递归遍历当前所有节点的实现方法是什么问题上存在疑惑,...
    99+
    2023-06-21
  • Java怎么用递归实现树形结构的工具类
    本文小编为大家详细介绍“Java怎么用递归实现树形结构的工具类”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java怎么用递归实现树形结构的工具类”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。需求描述有时候,我...
    99+
    2023-07-05
  • Java 数据结构中二叉树前中后序遍历非递归的具体实现详解
    目录一、前序遍历1.题目描述2.输入输出示例3.解题思路4.代码实现二、中序遍历1.题目描述2.输入输出示例3.解题思路4.代码实现三、后序遍历1.题目描述2.输入输出示例3.解题思...
    99+
    2022-11-12
  • 如何进行Java 数据结构中二叉树前中后序遍历非递归的具体实现
    本篇文章为大家展示了如何进行Java 数据结构中二叉树前中后序遍历非递归的具体实现,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、前序遍历1.题目描述给你二叉树的根节点 root ,返回它节点值的...
    99+
    2023-06-25
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作