Java递归的⽅式构造⼀棵树
  在实际代码开发中,构造⼀棵树是⼀个⽐较常见的业务场景,实现⽅式有多种多样,但是如何以⼀种较为优雅的⽅式构造⼀棵树,却是⼀个值得深思的问题。
  下⾯的⽅法,整体思路是:
  1)⾸先查出所有的节点,这样与数据库只交互⼀次,减少IO;
  2)第⼆次采⽤递归的⽅式构建树;
  3)采⽤ stream表达式,注意排序的两种实现⽅式;代码如下:
1public List<CategoryEntity> queryTree() {
2
3//1. ⾸先获取所有的实体类
4        List<CategoryEntity> categoryEntities = baseMapper.selectList(null);
5
6//2. 组装树形结构
sortedlist
7// 特点:
8//    1) ⾸先查出所有的节点,与数据库只交互⼀次,减少IO
9//    2) 然后对查询的节点采⽤递归的⽅式进⾏构造树
10        List<CategoryEntity> firstMenu = categoryEntities.stream().filter((categoryEntity) -> {
ParentCid() == 0;
12        }).map((menu) -> {
13            menu.setChildren(getAllChildrenTree(menu, categoryEntities));
14return menu;
15// 采⽤这种⽅式排序,注意⾮空判断
16        }).sorted((menu1, menu2) -> {
17return (Sort() == null ? 0 : Sort()) - (Sort() == null ? 0 : Sort());
18        }).List());
19
20
21return categoryEntities;
22  }
23
24
25//递归获取所有的⼦节点
26private List<CategoryEntity> getAllChildrenTree(CategoryEntity root, List<CategoryEntity> all) {
27        List<CategoryEntity> tree = all.stream().filter((categoryEntity) -> {
ParentCid() == CatId();
29        }).map((categoryEntity) -> {
30// 递归获取所有的⼦菜单
31            categoryEntity.setChildren(getAllChildrenTree(categoryEntity, all));
32return categoryEntity;
33//⼀级菜单正序排列,其他的逆序排列
34//采⽤两种排序⽅式进⾏实现,采⽤这种⽅式排序,注意⾮空判断 Comparator.nullsFirst(Integer::compareTo)
35        }).sorted(Comparatorparing(CategoryEntity::getSort, Comparator.nullsFirst(Integer::compareTo)).reversed())
36                .List());
37return tree;
38    }

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。