Java8新特性Stream——优雅的递归遍历树形结构, 递归删除节点

日常开发中会碰需要树形结构数据,层级菜单显示,或者是根据指定id删除该id和其包含的所有子节点,下面简单分享一下,如有错误,还请大佬指点

  1. 菜单实体类
/**
 * 

菜单实体类

* @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; } }
  1. 递归遍历树形结构
    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;
    }

	
  1. 递归删除节点及其子节点(结合MybatisPlus框架)
	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);
        });
	}
	

你可能感兴趣的:(Java,java,后端)