上篇讲到嵌套的数据类型的查询方式:三级菜单嵌套查询实现(collection标签),下面提供一种java Stream流的实现方式.主要的实现思路是将所有的菜单从数据库一次性查询出来,数据组装的方式在逻辑层进行处理,具体实现:先将顶级菜单筛选出来,然后进行递归遍历筛选出该菜单的所有子菜单信息,从性能的角度出发,整个实现过程使用stream流方式,当然从实现来讲,传统的for循环也是可以实现递归遍历组装数据,本文不做展开.数据查询上还需要collection标签,是因为菜单对象ManageUserMenu中子对象Menumeta需要借助标签进行数据组装.
实体类同上篇文件,这里不再展示,参考文章:三级菜单嵌套查询实现(collection标签)
数据库连接层:
// 查询所有菜单
List findAllManageMenu();
配置文件:
select * from manage_menu
逻辑处理层:
public void test3(){
// 查询所有的菜单信息
List allManageMenu = manageUserMapper.findAllManageMenu();
// 按照格式进行组装
List manageUserMenuList =
allManageMenu.stream().filter(manageUserMenu -> manageUserMenu.getParentId() == 0).map(manageUserMenu -> { manageUserMenu.setChildren(getChildrenMenuList(manageUserMenu,allManageMenu);
return manageUserMenu;
}).collect(Collectors.toList());
System.out.println(manageUserMenuList);
}
// 查询指定菜单下面的所有子菜单信息
public List getChildrenMenuList(ManageUserMenu origin,List allManageMenu){
List childrenMenuList = allManageMenu.stream()
.filter(manageUserMenu -> {
return manageUserMenu.getParentId()==origin.getMenuId();
})
.map(
manageUserMenu1 -> {
if (manageUserMenu1.getParentId() == origin.getMenuId()) {
manageUserMenu1.setChildren(getChildrenMenuList(manageUserMenu1, allManageMenu));
}
return manageUserMenu1;
}
).collect(Collectors.toList());
return childrenMenuList;
}



