首页 > 编程语言 >Java Stream流实现递归查询

Java Stream流实现递归查询

时间:2023-10-21 10:45:56浏览次数:39  
标签:category return Stream 递归 List item Java 节点 childrenMap

MySql数据库表结构

image

模拟数据

image

查询出所有数据,用父节点递归查询出所有子节点数据

  /**
     * 封装备注分类集合
     *
     * @param remarkTypeList 备注分类集合
     * @return 递归好的集合
     */
    @Override
    public List<RemarkType> queryRemarkTypeList(List<RemarkType> remarkTypeList) {
        Map<Long, List<RemarkType>> childrenMap = remarkTypeList.stream()
                .filter(item -> Objects.equals("0", item.getDisplayStatus()))
                .collect(Collectors.groupingBy(RemarkType::getParentId));
        return getChildren(0L, childrenMap);
    }

    /**
     * 递归查询子节点
     *
     * @param parentId    父id
     * @param childrenMap 子节点Map
     * @return 节点分类列表
     */
    private List<RemarkType> getChildren(Long parentId, Map<Long, List<RemarkType>> childrenMap) {
        return Optional.ofNullable(childrenMap.get(parentId))
                .orElse(Collections.emptyList())
                .stream()
                .peek(item -> item.setChildren(getChildren(item.getRemarkTypeId(), childrenMap)))
                .sorted(Comparator.comparingInt(item -> Optional.ofNullable(item.getSort()).orElse(0)))
                .collect(Collectors.toList());
    }

根据子节点查询所有父节点数据

  /**
     * 根据子节点查询全部父节点
     *
     * @param category 备注类型对象
     * @return 节点集合
     */
    @Override
    public List<String> getParent(RemarkType category) {
        List<String> types = new ArrayList<>();
        //没到顶层节点就一直递归
        if (category.getParentId() != 0L) {
            RemarkType parentCategory = getById(category.getParentId());
            types.addAll(getParent(parentCategory));
        }
        types.add(category.getTypeName());
        return types;
    }

标签:category,return,Stream,递归,List,item,Java,节点,childrenMap
From: https://www.cnblogs.com/Linzj5950/p/17778583.html

相关文章

  • 小程序底层技术机制解读 - JavaScript编程语言
    JavaScript是小程序的核心编程语言之一,它在小程序中起着至关重要的作用。本文将深入探讨JavaScript在小程序底层技术机制中的作用,以及如何利用JavaScript来构建小程序应用。同时,我们还将提供一个简单的代码演示,以帮助读者更好地理解JavaScript在小程序中的应用。JavaScript在小程序......
  • javaweb-会话跟踪技术
    首先了解什么是会话?会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束,在一次会话中可以包含多次请求和响应 上述图例就是会话。会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自同一浏览器,以便在同一次会话的多次请求中共享数据 ......
  • java基础漏洞学习----文件操作漏洞
    java基础漏洞学习----文件操作漏洞前置基础知识https://www.cnblogs.com/thebeastofwar/p/17760812.html文件上传漏洞文件上传的方式1.通过文件流index.jsp<%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%><!DOC......
  • Java类加载器
    Java中的类加载器Java中的类加载器大致可以分成两类,一类是系统提供的,另外一类则是由Java应用开发人员编写的。系统提供的类加载器主要有下面三个:引导类加载器(bootstrapclassloader):它用来加载Java的核心库,是用原生代码来实现的,并不继承自java.lang.ClassLoa......
  • 关于JAVA项目中的常用的异常处理情况
    JAVA项目中的常用的异常处理情况总结   在Java应用程序开发中,异常处理是至关重要的,因为它可以帮助您的程序应对各种不可预测的情况和错误。无论是在开发新项目还是在维护现有项目时,了解如何有效地处理异常是确保您的应用程序稳定性和可靠性的关键。本文将深入探讨Java项......
  • Java拾贝第七天——断言
    Java拾贝不建议作为0基础学习,都是本人想到什么写什么断言就是肯定,判断一个的结果。assert布尔表达式;assert布尔表达式:想要附带的信息断言一般是调试使用publicstaticvoidmain(String[]args){intx=10/2;assertx==5;assertx......
  • JAVA
    importjavax.swing.*;classAboutException{publicstaticvoidmain(String[]a){inti=1,j=0,k;k=i/j;try{k=i/j;//Causesdivision-by-zeroexception//thrownewException("Hello.Exce......
  • Java拾贝第七天——throws和throw、自定义异常
    Java拾贝不建议作为0基础学习,都是本人想到什么写什么throws在定义一个方法时可以使用throws,表示此方法不处理异常,转而交给方法的调用处进行处理。publicclassTest7{publicstaticvoidmain(String[]args){Mathmath=newMath();try{......
  • JAVA项目中的常用的异常处理情况总结
    在Java项目开发中,异常处理是至关重要的一部分。良好的异常处理能够提高程序的稳定性和可靠性,使得程序在面对意外情况时能够有所作为,而不至于因为一些小错误而导致整个系统崩溃。以下是Java项目中常见的异常处理情况及其处理方法的详细总结:1.空指针异常(NullPointerException)空指......
  • CentOS 8 解决 Error: Failed to download metadata for repo 'appstream': Cannot pr
      原因CentOS-8于2021年12月31日停止了源的服务。 解决办法3.1.备份原有的yum源配置文件cd/etc/yum.repos.d/mkdirbak;cp*.repobak/执行如下命令,替换配置文件内容sed-i's/$releasever/8-stream/g'CentOS*repo刷新yum缓存即可yumclean;yummakecache......