java查询三级树(三级目录)

背景:

三级树实现效果

image-20210423151426027

这里只介绍,查询数据库,构建三级目录的后端业务逻辑

1.创建查询类(对应数据库需要查出的字段)

@Data
@AllArgsConstructor
@NoArgsConstructor
public class ColumnTree {
    private Integer value; //当前标签的id
    private String label;
    private Integer parentId;//当前标签的父id

    private List<ColumnTree> children = new ArrayList<>();//递归思想,这个属性将作为子级目录
}

2.service层的业务逻辑

public GlobalResponse findColumnsTree() {
//先查询出数据所有的标签数据列表
List<ColumnTree> columnTrees = columnMapper.selectTreeInfo();
    //判断是否有数据
        if (CollectionUtils.isNotEmpty(columnTrees)) {
            // 过滤所有的一级目录,父id为0
            List<ColumnTree> firstColumn = columnTrees.stream().filter(c -> c.getParentId().toString().equals("0")).collect(Collectors.toList());

            //查出非一级目录,按照其父id分类
            Map<Integer, List<ColumnTree>> collect = columnTrees.stream().filter(c -> !(c.getParentId().toString().equals("0"))).collect(Collectors.groupingBy(ColumnTree::getParentId));

            //遍历一级目录
            firstColumn.forEach(a -> {
                //如果一级目录的id中是否包含非一级目录的父id
                if (collect.get(a.getValue()) == null) {
                    //没有,说明不是该一级目录没有下一级目录,则将其子目录设为空
                    a.setChildren(new ArrayList<>());
                } else {
                    //有,则说明有二级目录,将二级目录的的List集合,赋给子目录
                    a.setChildren(collect.get(a.getValue()));

                    //构建三级树
                    //遍历二级目录,判断是否含有三级目录
                    collect.get(a.getValue()).forEach(b -> {
                        if (collect.get(b.getValue()) == null) {
                            //没有,将二级目录下的三级目录设为空
                            b.setChildren(new ArrayList<>());
                        } else {
                            //有,将三级目录的List集合,赋给三级目录
                            b.setChildren(collect.get(b.getValue()));
                        }
                    });
                }
            });
            //将firstColumn返回,前端可以通过遍历获取各级目录的数据从而形成三级树的效果
              return GlobalResponse.success(firstColumn);
        } else {
            return GlobalResponse.success(new ArrayList<>());
        }
      }
原文地址:https://www.cnblogs.com/wtao0730/p/14694203.html