java8递归遍历树形结构

java8递归遍历树形结构

  1. 菜单实体类
@Data 
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),
        new Menu(6, "根节点2", 0),
        new Menu(7, "子节点1", 6),
        new Menu(8, "子子节点1.1", 7),
    );

    //筛选出根节点
    List<Menu> list = menus.stream().filter(menu -> "0".equals(menu.getPid())).peek(
        //设置子节点信息
        menu -> menu.setChildren(getChildrenList(menu, menus))
    ).collect(Collectors.toList());
}

private List<Menu> getChildrenList(Menu root, List<Menu> menus) {
    List<Menu> list = menus.stream().filter(menu ->
                                            //筛选出下一节点元素
                                            Objects.equals(menu.getPid(), root.getId())).map(menu -> {
        //递归set子节点
        menu.setChildren(this.getChildrenList(menu, menus));
        return menu;
    }).collect(Collectors.toList());	
    return list;
}
  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(getChildrenList(menu, menus))
    ).findFirst().orElse(new Menu());
}

private List<Menu> getChildrenList(Menu root, List<Menu> menus) {
    List<Menu> list = menus.stream().filter(menu ->
                                            //筛选出下一节点元素
                                            Objects.equals(menu.getPid(), root.getId())).map(menu -> {
        //递归set子节点
        menu.setChildren(this.getChildrenList(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)