Java递归的方式构造一棵树


  在实际代码开发中,构造一棵树是一个比较常见的业务场景,实现方式有多种多样,但是如何以一种较为优雅的方式构造一棵树,却是一个值得深思的问题。

  下面的方法,整体思路是:

  1)首先查出所有的节点,这样与数据库只交互一次,减少IO;

  2)第二次采用递归的方式构建树;

  3)采用 stream表达式,注意排序的两种实现方式; 代码如下:

 1   public List<CategoryEntity> queryTree() {  2 
 3         //1. 首先获取所有的实体类
 4         List<CategoryEntity> categoryEntities = baseMapper.selectList(null);  5 
 6         //2. 组装树形结构  7         // 特点:  8         // 1) 首先查出所有的节点,与数据库只交互一次,减少IO  9         // 2) 然后对查询的节点采用递归的方式进行构造树
10         List<CategoryEntity> firstMenu = categoryEntities.stream().filter((categoryEntity) -> { 11             return categoryEntity.getParentCid() == 0; 12         }).map((menu) -> { 13  menu.setChildren(getAllChildrenTree(menu, categoryEntities)); 14             return menu; 15             // 采用这种方式排序,注意非空判断
16         }).sorted((menu1, menu2) -> { 17             return (menu1.getSort() == null ? 0 : menu1.getSort()) - (menu2.getSort() == null ? 0 : menu2.getSort()); 18  }).collect(Collectors.toList()); 19 
20 
21         return categoryEntities; 22    } 23 
24 
25     //递归获取所有的子节点
26     private List<CategoryEntity> getAllChildrenTree(CategoryEntity root, List<CategoryEntity> all) { 27         List<CategoryEntity> tree = all.stream().filter((categoryEntity) -> { 28             return categoryEntity.getParentCid() == root.getCatId(); 29         }).map((categoryEntity) -> { 30             // 递归获取 所有的子菜单
31  categoryEntity.setChildren(getAllChildrenTree(categoryEntity, all)); 32             return categoryEntity; 33             //一级菜单正序排列,其他的逆序排列 34             //采用两种排序方式进行实现,采用这种方式排序,注意非空判断 Comparator.nullsFirst(Integer::compareTo)
35  }).sorted(Comparator.comparing(CategoryEntity::getSort, Comparator.nullsFirst(Integer::compareTo)).reversed()) 36  .collect(Collectors.toList()); 37         return tree; 38     }

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM