日常开发中会碰需要树形结构数据,层级菜单显示,或者是根据指定id删除该id和其包含的所有子节点,下面简单分享一下,如有错误,还请大佬指点
/**
* 菜单实体类
* @author : Zyy
* @date : 2020-12-26 17:41
**/
@Data //lombok注解,自动生成set和get方法
public class Menu {
//id
private String id;
//菜单名
private String name;
//父节点id
private String pid;
//子节点信息
private List<Menu> children;
//无参构造
public Menu() {}
//带参构造
public Menu(String id, String name, String pid) {
this.id = id;
this.name = name;
this.pid= pid;
}
}
public void getTreeMenu() {
//模拟数据库查出所有数据
List<Menu> menus = Arrays.asList(
new Menu(1, "根节点", 0),
new Menu(2, "子节点1", 1),
new Menu(3, "子子节点1.1", 2),
new Menu(6, "子子子节点1.1.1", 3),
new Menu(4, "子节点2", 1),
new Menu(5, "子子节点2.1", 4)
);
//筛选出根节点
List<Menu> list = menus.stream().filter(menu -> "0".equals(menu.getPid())).peek(
//设置子节点信息
menu -> menu.setChildren(getChildrens(menu, menus))
).collect(Collectors.toList());
}
private List<Menu> getChildrens(Menu root, List<Menu> menus) {
List<Menu> list = menus.stream().filter(menu ->
//筛选出下一节点元素
Objects.equals(menu.getPid(), root.getId())).map(menu -> {
//递归set子节点
menu.setChildren(this.getChildrens(menu, menus));
return menu;
}).collect(Collectors.toList());
return list;
}
public void deleteMenus(String id) {
//存储所有要删除的id
List<String> idList = new ArrayList<>();
//获得所有需要删除的id
this.selectChildListById(id, idList);
//添加删除的节点id
idList.add(id);
//MybatisPlus批量删除方法
baseMapper.deleteBatchIds(idList);
}
private String selectChildListById(String id, List<String> idList) {
//查询数据库pid等于id的数据
List<Menu> childList = baseMapper.selectList(new QueryWrapper<Menu>().eq("pid", id).select("id"));
//递归查询下一级id,同时将上一次查询结果添加到list集合
childList.forEach(menu-> {
idList.add(menu.getId());
this.selectChildListById(menu.getId(), idList);
});
}