上篇文章写了一下递归生成树形数据的实现,本文写一下非 递归法 方式生成树的方法。
话不多说,show code:
pid即要查询的节点id,all为要生成树结构的数据
public List<SysAreaVo> createTree3(String pid, List<SysAreaVo> all) {
Map <String, List<SysAreaVo>> map = all.stream().collect(Collectors.groupingBy(SysAreaVo::getParentCode));
List<SysAreaVo> data = all.stream().filter(d -> map.containsKey(d.getAreaCode())).collect(Collectors.toList());
for (SysAreaVo area : data) {
area.setChildren(map.get(area.getAreaCode()));
}
return data.stream().filter(sa -> pid.equals(sa.getParentCode())).collect(Collectors.toList());
}
简单介绍下思路:
- 按照父节点将数据进行分组;
- 用上一步获取到的父节点集合过滤出有子集的数据;
- 循环所有有子集的数据,将子集赋值给当前数据;
- 第三步完成以后,所有数据如果有下一级的话,都会得到自己的子集数据;过滤出第一层的数据,即为要返回的数据。
本质上就是处理子集数据而已