:::info Long 类型的包装类型比较不要直接使用 ==,要用到 longValue() 或者 equals() 因为第 11 和 33 行代码,catId 和 parentCid 是 Long 型的 :::

    1. 查询出数据库所有分类数据
    2. 先获取父ID为0的,也就是最外面一层的大分类,然后在获取的对象类里面加一个 children 属性,将这个大分类下面的所有子分类装进去(children 属性要加注解 @TableField(exist = false))

      1. public List<CategoryEntity> listWithTree() {
      2. //1.查出所有分类
      3. List<CategoryEntity> entities = baseMapper.selectList(null);
      4. //2.组装成父子的树形结构
      5. //2.1找到所有一级分类
      6. List<CategoryEntity> level1Menus = entities.stream()
      7. //过滤出最大一级的父分类
      8. .filter(categoryEntity -> categoryEntity.getParentCid().longValue() == 0)
      9. //将父分类所有子分类 set 进去
      10. .map(e -> {
      11. e.setChildren(getChildren(e,entities));
      12. return e;
      13. })
      14. //排序
      15. .sorted((menu1,menu2) -> {
      16. return (menu1.getSort() == null ? 0 : menu1.getSort()) - (menu2.getSort() == null ? 0 : menu2.getSort());
      17. })
      18. //收集成 list 集合
      19. .collect(Collectors.toList());
      20. return level1Menus;
      21. }
      22. /***
      23. * 递归查找所有菜单的子菜单
      24. * @param root 目前的父分类(需要 setChildren 的类)
      25. * @param all 所有分类
      26. * @return
      27. */
      28. private List<CategoryEntity> getChildren(CategoryEntity root,List<CategoryEntity> all){
      29. List<CategoryEntity> children = all.stream()
      30. //过滤该类的子分类
      31. .filter((e) -> {
      32. return e.getParentCid().longValue() == root.getCatId().longValue();
      33. })
      34. //将这个分类下的子分类 set 进去
      35. .map(e -> {
      36. e.setChildren(getChildren(e, all));
      37. return e;
      38. })
      39. //排序
      40. //三元运算是为了防止空指针
      41. .sorted((menu1,menu2) -> {
      42. return (menu1.getSort() == null ? 0 : menu1.getSort()) - (menu2.getSort() == null ? 0 : menu2.getSort());
      43. })
      44. //收集成 list 集合
      45. .collect(Collectors.toList());
      46. return children;
      47. }