温州网站制作价格,书画院网站源码,做核酸检测收费标准,儿童网站html模板简介#xff1a; 在实际开发中#xff0c;构建树状层次结构是常见需求#xff0c;如组织架构、目录结构或菜单系统。本教案通过解析给定的Java代码#xff0c;展示如何使用Java 8 Stream API将扁平化的菜单数据转换为具有层级关系的树形结构。
1. 核心类定义 - Menu
Data…简介 在实际开发中构建树状层次结构是常见需求如组织架构、目录结构或菜单系统。本教案通过解析给定的Java代码展示如何使用Java 8 Stream API将扁平化的菜单数据转换为具有层级关系的树形结构。
1. 核心类定义 - Menu
Data
NoArgsConstructor
AllArgsConstructor
static class Menu {private Long id;private String name;private Long parentId;private ListMenu children;
}提示此处定义了一个名为Menu的类它包含了菜单项的基本属性包括ID、名称、父菜单ID以及一个用于存储子菜单项的列表。
2. main方法解析及实现功能 输入参数
ListMenu menus包含所有菜单项的集合。
输出结果
ListMenu一个仅包含顶级菜单项的列表每个顶级菜单项已填充了其下级子菜单。
public static void main(String[] args) {ListMenu menus menusData();/*** 从菜单列表中筛选出顶级菜单并为其添加子菜单。** param menus 菜单列表包含所有菜单项。* return 包含所有顶级菜单的列表其中每个顶级菜单均已包含其所有子菜单。*/ListMenu topLevelMenus menus.stream() // 使用流处理menus集合.filter(menu - menu.getParentId() 0 || menus.stream().noneMatch(other - other.getId().equals(menu.getParentId()))) // 筛选条件父菜单ID为0或不存在对应父菜单的菜单项.peek(menu - menu.setChildren(getChildren(menu, menus))) // 为每个顶级菜单设置子菜单.collect(Collectors.toList()); // 将筛选后的顶级菜单集合转换为List(Menu)类型} 3. 辅助方法——获取指定菜单的所有子菜单 /*** 获取指定菜单的所有子菜单。** param menu 指定的菜单对象我们要查找它的子菜单。* param menus 所有菜单的列表从中筛选出子菜单。* return 返回一个包含指定菜单所有子菜单的列表。这个列表中的每个菜单对象都可能包含它们自己的子菜单列表。*/private static ListMenu getChildren(Menu menu, ListMenu menus) {// 使用流对菜单列表进行处理筛选出指定菜单的子菜单return menus.stream().filter(child - child.getParentId().equals(menu.getId())) // 筛选条件菜单的父菜单ID与指定菜单ID匹配.peek(child - child.setChildren(getChildren(child, menus))) // 递归设置每个子菜单的子菜单列表.collect(Collectors.toList()); // 收集结果生成列表}
4. 示例数据生成方法 —— menusData()
private static ListMenu menusData() {return Arrays.asList(new Menu(1L, 一级菜单1, 0L, null),new Menu(2L, 二级菜单1, 1L, null),new Menu(3L, 三级菜单1, 2L, null),new Menu(4L, 一级菜单2, 0L, null),new Menu(5L, 二级菜单2, 4L, null),new Menu(6L, 一级菜单3, 0L, null));
}5.完整代码以及演示(TreeExample.java)
package com.tenement.auto;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;public class TreeExample {DataNoArgsConstructorAllArgsConstructorstaticclass Menu {private Long id;private String name;private Long parentId;private ListMenu children;}public static void main(String[] args) {ListMenu menus menusData();/*** 从菜单列表中筛选出顶级菜单并为其添加子菜单。** param menus 菜单列表包含所有菜单项。* return 包含所有顶级菜单的列表其中每个顶级菜单均已包含其所有子菜单。*/ListMenu topLevelMenus menus.stream() // 使用流处理menus集合.filter(menu - menu.getParentId() 0 || menus.stream().noneMatch(other - other.getId().equals(menu.getParentId()))) // 筛选条件父菜单ID为0或不存在对应父菜单的菜单项.peek(menu - menu.setChildren(getChildren(menu, menus))) // 为每个顶级菜单设置子菜单.collect(Collectors.toList()); // 将筛选后的顶级菜单集合转换为List(Menu)类型}/*** 获取指定菜单的所有子菜单。** param menu 指定的菜单对象我们要查找它的子菜单。* param menus 所有菜单的列表从中筛选出子菜单。* return 返回一个包含指定菜单所有子菜单的列表。这个列表中的每个菜单对象都可能包含它们自己的子菜单列表。*/private static ListMenu getChildren(Menu menu, ListMenu menus) {// 使用流对菜单列表进行处理筛选出指定菜单的子菜单return menus.stream().filter(child - child.getParentId().equals(menu.getId())) // 筛选条件菜单的父菜单ID与指定菜单ID匹配.peek(child - child.setChildren(getChildren(child, menus))) // 递归设置每个子菜单的子菜单列表.collect(Collectors.toList()); // 收集结果生成列表}private static ListMenu menusData() {return Arrays.asList(new Menu(1L, 一级菜单1, 0L,null),new Menu(2L, 二级菜单1, 1L,null),new Menu(3L, 三级菜单1, 2L,null),new Menu(4L, 一级菜单2, 0L,null),new Menu(5L, 二级菜单2, 4L,null),new Menu(6L, 一级菜单3, 0L,null));}}总结该案例展示了如何利用Java 的Stream API对菜单数据进行处理首先筛选出顶级菜单项并通过递归方式为其添加子菜单。最后得到了一个完整的树形菜单结构。