Java递归的⽅式构造⼀棵树
在实际代码开发中,构造⼀棵树是⼀个⽐较常见的业务场景,实现⽅式有多种多样,但是如何以⼀种较为优雅的⽅式构造⼀棵树,却是⼀个值得深思的问题。
下⾯的⽅法,整体思路是:
1)⾸先查出所有的节点,这样与数据库只交互⼀次,减少IO;
2)第⼆次采⽤递归的⽅式构建树;
3)采⽤ stream表达式,注意排序的两种实现⽅式;代码如下:
1public List<CategoryEntity> queryTree() {
2
3//1. ⾸先获取所有的实体类
4 List<CategoryEntity> categoryEntities = baseMapper.selectList(null);
5
6//2. 组装树形结构
sortedlist7// 特点:
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小时内删除。
发表评论