Stream流-Java8Stream流递归搞定遍历树形结构-《Java笔记》

admin 2025-10-19 02:41:24 编程 来源:ZONE.CI 全球网 0 阅读模式

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

实体类:Menu.java

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

递归组装树形结构

  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. }

格式化打印结果

Java8 Stream流递归搞定遍历树形结构 - 图1

以太坊cppgolang区别 编程

以太坊cppgolang区别

以太坊是一种去中心化的开源平台,它采用智能合约技术,旨在构建和运行不受干扰的分布式应用程序。作为目前最受欢迎的区块链平台之一,以太坊提供了多种编程语言的支持,其
progolang 编程

progolang

Go语言(Golang)是由Google开发的一门静态类型编程语言。作为一名专业的Golang开发者,我深知这门语言的优势和特点。在本文中,我将介绍Golang
golangn个发送者 编程

golangn个发送者

Golang是一种开源的编程语言,由Google团队开发,旨在提高程序的并发性和简化软件开发过程。在Go语言中,有时需要向多个接收者发送信息。本文将介绍如何在G
golang技能图谱 编程

golang技能图谱

从互联网行业的快速发展到人工智能技术的日益成熟,各种编程语言也应运而生。而在这众多的编程语言中,Golang(即Go)作为一门强大且高效的开发语言备受关注。Go
评论:0   参与:  5