一般情况下,我们可以通过 SQL 的方式和 Java 的方式获取树形数据,比如常见的菜单数据、用户组织数据等。下面我们使用 Java 的 Stream 类处理获取树形数据。
下图是对应的数据模型,我们主要需要关注的就是分类标识 cat_id、父分类标识 parent_cid 和排序字段 sort。
如下是对应的代码,具体分析见注释:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
|
@Override public List<CategoryEntity> listWithTree() { List<CategoryEntity> entities = baseMapper.selectList(null);
List<CategoryEntity> collect = entities.stream().filter( e -> e.getParentCid() == 0 ).map(e -> { e.setChildren(getChildren(e, entities)); return e; }).sorted((e1, e2) -> (e1.getSort() == null ? 0 : e1.getSort()) - (e2.getSort() == null ? 0 : e2.getSort())).collect(Collectors.toList()); return collect; }
private List<CategoryEntity> getChildren(CategoryEntity curMenu, List<CategoryEntity> allMenus) { List<CategoryEntity> entities = allMenus.stream().filter(e -> curMenu.getCatId().equals(e.getParentCid()) ).map(e -> { e.setChildren(getChildren(e, allMenus)); return e; }).sorted((e1, e2) -> (e1.getSort() == null ? 0 : e1.getSort()) - (e2.getSort() == null ? 0 : e2.getSort())).collect(Collectors.toList()); return entities; }
|
下图是对应的数据返回结果: