可能平常会遇到一些需求,比如构建菜单,构建树形结构,数据库一般就使用父id来表示,为了降低数据库的查询压力,我们可以使用Java8中的Stream流一次性把数据查出来,然后通过流式处理。

实体类:Menu.java

  1. /**
  2. * Menu
  3. *
  4. * @author lcry
  5. * @date 2020/06/01 20:36
  6. */
  7. @Data
  8. @Builder
  9. public class Menu {
  10. /**
  11. * id
  12. */
  13. public Integer id;
  14. /**
  15. * 名称
  16. */
  17. public String name;
  18. /**
  19. * 父id ,根节点为0
  20. */
  21. public Integer parentId;
  22. /**
  23. * 子节点信息
  24. */
  25. public List<Menu> childList;
  26. public Menu(Integer id, String name, Integer parentId) {
  27. this.id = id;
  28. this.name = name;
  29. this.parentId = parentId;
  30. }
  31. public Menu(Integer id, String name, Integer parentId, List<Menu> childList) {
  32. this.id = id;
  33. this.name = name;
  34. this.parentId = parentId;
  35. this.childList = childList;
  36. }
  37. }

递归组装树形结构:

  1. @Test
  2. public void testtree(){
  3. //模拟从数据库查询出来
  4. List<Menu> menus = Arrays.asList(
  5. new Menu(1,"根节点",0),
  6. new Menu(2,"子节点1",1),
  7. new Menu(3,"子节点1.1",2),
  8. new Menu(4,"子节点1.2",2),
  9. new Menu(5,"根节点1.3",2),
  10. new Menu(6,"根节点2",1),
  11. new Menu(7,"根节点2.1",6),
  12. new Menu(8,"根节点2.2",6),
  13. new Menu(9,"根节点2.2.1",7),
  14. new Menu(10,"根节点2.2.2",7),
  15. new Menu(11,"根节点3",1),
  16. new Menu(12,"根节点3.1",11)
  17. );
  18. //获取父节点
  19. List<Menu> collect = menus.stream().filter(m -> m.getParentId() == 0).map(
  20. (m) -> {
  21. m.setChildList(getChildrens(m, menus));
  22. return m;
  23. }
  24. ).collect(Collectors.toList());
  25. System.out.println("-------转json输出结果-------");
  26. System.out.println(JSON.toJSON(collect));
  27. }
  28. /**
  29. * 递归查询子节点
  30. * @param root 根节点
  31. * @param all 所有节点
  32. * @return 根节点信息
  33. */
  34. private List<Menu> getChildrens(Menu root, List<Menu> all) {
  35. List<Menu> children = all.stream().filter(m -> {
  36. return Objects.equals(m.getParentId(), root.getId());
  37. }).map(
  38. (m) -> {
  39. m.setChildList(getChildrens(m, all));
  40. return m;
  41. }
  42. ).collect(Collectors.toList());
  43. return children;
  44. }

格式化打印结果:
Stream遍历树形结构 - 图1