递归查找三级菜单以及Stream流filter()与map()的用法

2023-11-13

  • 查询策略
    需求:查询三级菜单,按层级返回并排序

(1)给实体类添加字段,用来封装子菜单,@TableField(exist = false)不映射数据库字段

	@TableField(exist = false)
	private List<CategoryEntity> children;

(2)查出一级菜单,使用过滤器,筛选条件为父Id=0
(3)从一级菜单开始一级一级向下查找子菜单,
(4)查出全部菜单的父id=一级菜单id,就可筛选出一级菜单的子类,然后递归查一级菜单的子类的子类,最后返回一级菜单子类
(5)升序排序,使用比较器comparator比较,传入两个参数a,比较,当a<b返回-1,a==b返回0,a>b返回1

	//比较流元素,Stream<T> sorted(Comparator<? super T> comparator);
	sorted((menu1, menu2) -> {
 		return (menu1.getCatLevel()==null?0:menu1.getCatLevel()) - (menu2.getCatLevel()==null?0:menu2.getCatLevel());
 	})
  • Stream流filter()与map()的区别
    需要转换list集合时使用steam流,只需要取list集合中的元素使用增强for即可
    filter是筛选集合,map是对集合的元素进行转换
    filter返回符合boolean类型的元素,map返回处理完成的集合
    例:
    filter() [a1,a2,a3] -> [a1]
    map() [a1,a2,a3] -> [1,2,3]
/**
     * 查询所以分类以及子分类,并按树状结构分组
     * @return durunwu
     */
    @Override
    public List<CategoryEntity> queryListToTree() {
        List<CategoryEntity> categoryEntities = baseMapper.selectList(null);
        List<CategoryEntity> level1Menu = categoryEntities.stream()
                .filter(data -> data.getParentCid() == 0)
                .map(menu -> {//menu: 上面筛选出的一级菜单
                	//getChildCategoryEntity(父类,全部菜单), 全部菜单的父id=父类id,就可筛选出父类的子类
                    menu.setChildren(getChildCategoryEntity(menu,categoryEntities));
                    return menu;
                }).sorted((menu1, menu2) -> {//上一步返回的menu是一级菜单,所以下面是给一级菜单排序
                    return (menu1.getCatLevel()==null?0:menu1.getCatLevel()) - (menu2.getCatLevel()==null?0:menu2.getCatLevel());
                }).collect(Collectors.toList());
        return level1Menu;
    }

    /**
     * 获取当前菜单的子菜单,并按升序排序
     * @param menu 当前菜单
     * @param categoryEntities 所有菜单
     * @return List<CategoryEntity>
     */
    public List<CategoryEntity> getChildCategoryEntity(CategoryEntity menu,List<CategoryEntity> categoryEntities){
        List<CategoryEntity> entities = categoryEntities.stream().filter(entity -> {
            //返回所有类中父类id等于menu 分类id的类,证明此类为menu类的子类
            return entity.getParentCid().equals(menu.getCatId());
        }).map(entity -> {//entity:上面查出的子类
            //递归取子菜单
            entity.setChildren(getChildCategoryEntity(entity,categoryEntities));
            return entity;
        }).sorted((menu1, menu2) -> {
            return (menu1.getCatLevel()==null?0:menu1.getCatLevel()) - (menu2.getCatLevel()==null?0:menu2.getCatLevel());
        }).collect(Collectors.toList());
        return entities;
    }

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

递归查找三级菜单以及Stream流filter()与map()的用法 的相关文章

  • 尝试提取 jar 文件时出错

    我正在尝试使用以下命令提取 jar 文件 C Program Files Java jdk1 7 0 25 bin gt jar xf C Users MyJar jar 但出现错误 java io IOException META INF
  • 无法从 java 发送 48681 字节消息以保护 wcf 服务

    我必须使用相互身份验证从 java 调用安全的 WCF 服务 一切工作正常 除了我无法发送大小超过 48680 字节的消息 因此 48680 字节的消息已成功发送 但 48681 字节的消息未成功发送 并且 java 应用程序因读取超时异常
  • 将嵌套的 ArrayList 转换为 Java List

    我有这个方法 public List
  • 什么是“非阻塞”并发?它与普通并发有何不同?

    什么是 非阻塞 并发 它与使用线程的普通并发有何不同 为什么不在所有需要并发的场景中都使用非阻塞并发呢 使用非阻塞并发有开销吗 我听说Java中可以实现非阻塞并发 我们是否应该在特定场景下使用此功能 将这些方法之一与集合一起使用是否有区别或
  • Java 增强型 For-Loop 比传统的更快?

    所以我的理解是 增强的 for 循环应该更慢 因为它们必须使用迭代器 但是我的代码提供了混合结果 是的 我知道循环逻辑占用了循环中花费的大部分时间 对于少量迭代 100 1000 增强的 for 循环在使用和不使用 JIT 的情况下似乎都要
  • HashMap何时以及如何将桶从链表转换为红黑树? [复制]

    这个问题在这里已经有答案了 我正在研究 java 8 功能 发现当存储桶上的条目集数量增加时 哈希图使用红黑树而不是链表 但是 这是否不需要密钥是可比较的或存在某种密钥排序以及这是如何工作的 这种转变何时真正发生以及如何发生 当有at le
  • Junit测试中LocalDateTime反序列化的问题

    我有问题LocalDateTime反序列化Junit测试 我有简单的REST API返回一些DTO目的 当我呼叫端点时 响应没有问题 它是正确的 然后我尝试编写单元测试 得到MvcResult并使用ObjectMapper将其转换为我的DT
  • 写入作为 Jar 文件中的资源包含的 Java 属性文件

    有没有办法修改作为资源存储在 Jar 文件中的属性文件中的属性值 这就是我正在尝试处理的场景 我有一个属性文件作为资源存储在我的 Jar 文件中 有一些系统特定的属性 例如路径 我希望能够为我想要运行 Jar 文件的系统更改此设置 最好的解
  • 如何从 Jackson 中的自定义解串器调用默认解串器

    我在杰克逊的自定义解串器有问题 我想访问默认序列化器来填充我要反序列化的对象 在填充之后 我将做一些自定义的事情 但首先我想使用默认的 Jackson 行为反序列化对象 这是我目前拥有的代码 public class UserEventDe
  • 在所有方法调用上允许类型见证有什么意义?

    假设我们有两种方法 如下所示 public static
  • 无法在android中使用retrofit发出@Post请求

    我正在学习如何在 android 中使用改造 但是每当我尝试从互联网检索数据时 我的应用程序不会返回任何内容我的响应没有成功 我不知道如何修复当前我正在尝试发布的错误并使用此 URL 检索数据https jsonplaceholder ty
  • 使用 java 中的准备好的语句插入自定义 SQL 类型

    我有一些自定义类型 它们基本上都是枚举 以下是它们的外观示例 CREATE TYPE card suit AS ENUM spades clubs hearts diamonds 我在 Java 中有一些准备好的语句 看起来像这样 Setu
  • Jackson 中没有注释的多态反序列化

    我有一个CloudEvent
  • 如何在不打开浏览器的情况下查看 Android 应用程序中的网页?

    嘿 我正在开发一个 Android 应用程序 我想连接到该应用程序内的网络 不过 我在某种程度上尝试过 WebView 但它在我的目录中显示的文件很好 但当连接到 google com 时 它显示错误 然后我添加了这个文件
  • 码头无故停止

    我需要经验丰富的码头用户的建议 我在负载均衡器 亚马逊云 后面维护着 2 台 Linux 机器 使用 Jetty 9 0 3 有时我的 Jetty 容器会被 Thread 2 无故关闭 同时地 显示以下日志并且容器无故停止 没有错误 没有例
  • 使用 JPA 存储库保留 Spring Batch ItemWriter 的问题

    我对春季批次有疑问ItemWriter它依赖于 JPA 存储库来更新数据 这里是 Component public class MessagesDigestMailerItemWriter implements ItemWriter
  • 在大画布上滚动

    我需要一些帮助来了解滚动绘制到 Android 画布上的项目的基础知识 假设我想创建一个时间线 其中 0 处的时间是可视化的顶部 并且随着时间的增加 时间线继续呈现在上一个点下方 如果我想在 Android 上渲染它 我知道我可以通过重写
  • 有没有办法防止 Spring Boot 覆盖 bean?

    与春天的抽象可刷新应用程序上下文 http docs spring io spring docs current javadoc api org springframework context support AbstractRefresh
  • 如何使用JSqlParser向sql添加where条件?

    我想用JSqlParser向sql添加where条件 例如 Before select from test table where a 1 group by c After select from test table where a 1
  • 从 Brixton.RC1 开始的 ZuulProxy 未传递授权标头

    从 Spring Cloud 切换时Brixton M5 to Brixton RC1我的 ZuulProxy 不再通过Authorization标头下游到我的代理服务 我的设置中有各种各样的角色 但大多数都相当简单 Authorizati

随机推荐

  • CH8-HarmonyOS流转架构解析

    文章目录 前言 目标 核心概念 流转架构特性 Ability的调度 流转应用场景 流转架构 核心模块 跨端迁移关键流程 多端协同关键流程 分布式任务调度 连接远程PA 启动远程FA PA 迁移FA 接口IAbilityContinuatio
  • Android强大的图表开源——MPAndroidChart

    介绍 在APP开发中遇到图表的样式 一般我们要先查询GitHub上比较火的开源框架 这种图标应用广泛 统计 游戏统计 人际关系图等等 用到今天的这个框架MPAndroidChart 点击查看GitHub 一个可以拖动缩放的图表库 包含曲线图
  • 求整数的位数及各位数字之和 (15 分)

    7 5 求整数的位数及各位数字之和 15 分 对于给定的正整数N 求它的位数及其各位数字之和 输入格式 输入在一行中给出一个不超过10 9 的正整数N 输出格式 在一行中输出N的位数及其各位数字之和 中间用一个空格隔开 输入样例 321 输
  • 【Docker】Docker API的使用

    1 通过实训平台进入到操作系统界面 在 后输入vi usr lib systemd system docker service命令 进入编译模式 然后按i 小写 键 修改代码 usr bin dockerd current H tcp 0
  • 创建一维数组,长度为20,元素索引值为索引的二倍,奇数为负偶数为正,然后对数组排序

    import java util Arrays public class ArrayCreate public static void main String args int a new int 20 for int i 0 i lt 2
  • 单屏播放asf和vga文件的教学视频

    在自己的电脑上播放三分屏教学视频时 总觉得左边那两个小屏幕太占位置 还有右上方的小屏幕的播放进度条太短而无法精确拖放 虽然不是很懂HTML 但修改一下代码 还是单屏能播放的 下面是单屏播放asf和vga文件的设置 1 文件夹结构 index
  • CSS 实现七彩圆环loading动画

    前言 CSS 实现七彩圆环loading动画 速速来Get吧 1 实现效果 2 实现步骤 定义父容器宽度为 w 每个圆环之间的gap间距为 gap 圆环的border边框宽为 border root border 5px gap 30px
  • Java小练习——图书管理系统

    目录 一 图书管理系统应具备的功能 二 简单分析如何实现该系统 三 框架图 四 代码实现过程及简析 1 Book类 简析 2 BookShelf类 简析 3 IOperation接口 3 1 AddOperation类 3 2 Borrow
  • 离散事件模型

    离散事件模型通常需要用到队列和线性表 典型的例子是银行业务的模拟 本文参考的是严蔚敏的 数据结构 过程如下 用四个队列表示银行的四个窗口 用一个有序链表存储到达事件和离开事件 在初始化函数里面先初始化四个队列和一个链表 并且产生一个到达事件
  • 解决Eclipse添加新server时无法选择Tomcat7.0

    解决Eclipse添加新server时无法选择Tomcat7 0 新添加tomcat时 出现如下图情况 解决方法 这时打开工作空间目录下的 metadata plugins org eclipse core runtime settings
  • 面试题13. 机器人的运动范围(java+python)

    地上有一个m行n列的方格 从坐标 0 0 到坐标 m 1 n 1 一个机器人从坐标 0 0 的格子开始移动 它每次可以向左 右 上 下移动一格 不能移动到方格外 也不能进入行坐标和列坐标的数位之和大于k的格子 例如 当k为18时 机器人能够
  • 高级快速读入

    namespace fastIO define BUF SIZE 100000 fread gt read bool IOerror 0 inline char nc static char buf BUF SIZE p1 buf BUF
  • 考勤系统需求分析(软件工程)

    前言 随着企业人事管理的日趋复杂和企业人员的增多 企业的考勤管理变得越来越复杂 有一个比较完善的考勤管理系统显得是如此的重要 考勤管理系统是使用计算机管理方式代替以前手工处理的工作 应用计算机技术和通信技术建立一个高效率的 无差错的考勤管理
  • javascript 算法_JavaScript中的算法

    javascript 算法 The word Algorithms or Algo would impact fear in anyone who isn t really strong in maths like me Well toda
  • 2023年无人航空系统与航空航天国际会议(ICUASA 2023)

    2023年无人航空系统与航空航天国际会议 ICUASA 2023 重要信息 会议网址 www icuasa org 会议时间 2023年2月18 20日 召开地点 中国广州 截稿时间 2023年12月30日 录用通知 投稿后2周内 收录检索
  • 事物有哪些特性 ?MySQL 如何保证事物的四大特性 ?

    目录 1 事物有哪些特性 2 MySQL 如何保证事物的四大特性 3 事物的隔离级别 1 事物有哪些特性 1 1 何为事物 事物就是把一件事情的多个步骤 多个操作 打包成一个步骤 一个操作 其中任意一个步骤执行失败 都会进行回退 使影响降到
  • Linux df -h 显示磁盘空间满,但实际未占用满——问题分析

    问题现象 工作中遇到一个问题 在 TX2 系统上 告警提示磁盘空间不够 如图所示 wohu wohu df h Filesystem Size Used Avail Use Mounted on dev root 28G 28G 0 100
  • 关于个人vs调试时“字符串中字符无效“的处理办法

    一开始选中要监视的字符串那一行开始调试时出现字符串中字符无效 后来瞎猫碰到死耗子 选中被监视的下一行时竟然就可以了 希望对大家有帮助 不过原理我不太懂我也是个小白 希望评论区有大佬给我提点提点背后的原理是啥
  • Arnold置乱变换的代码实现与置乱度分析

    1 传统Arnold置乱变换算法简介 Arnold置乱变换 又称为cat映射 是一种基于古典密码体制的图像加密算法 本质上是对长宽相等的图像进行拉伸与折叠操作以改变空间中像素点的位置 从而破坏图像相邻像素点之间的相关性 它的安全性较低 易利
  • 递归查找三级菜单以及Stream流filter()与map()的用法

    查询策略 需求 查询三级菜单 按层级返回并排序 1 给实体类添加字段 用来封装子菜单 TableField exist false 不映射数据库字段 TableField exist false private List