最近徒弟在写省市区的三级联动,特此记录。
数据格式为树形,children子集嵌套。
注:因为优化之后只有第一个代码了,其他代码都删掉了,大概写下思路吧
一、java8写法,最终型
//查所有数据
List<SodaCityVo> sodaCitiesList=sodaCityMapper.selectVoList(null);
//将数据以父类ID分组成map:{1:[xxx,xxx],2:[xxx,xxxx]}
Map<Long, List<SodaCityVo>> parentIdMap = sodaCitiesList.stream().collect(Collectors.groupingBy(SodaCityVo::getCityPid, Collectors.toList()));
//循环每个数据,从父类MAP中通过他的ID获取他的子类塞到children中
sodaCitiesList.forEach(sodaCityVo -> {
List<SodaCityVo> sodaCityVos = parentIdMap.get(sodaCityVo.getCityId());
if (ObjectUtil.isNotEmpty(sodaCityVos)){
sodaCityVo.setChildren(sodaCityVos);
}
});
//只筛选出最顶级数据
return sodaCitiesList.stream().filter(sodaCityVo -> sodaCityVo.getCityPid() == parentCityId).collect(Collectors.toList());
优点:代码少,性能中
缺点:塞数据时要循环全部数据
二、递归
//常规的递归,也是比较简单易懂的
//1查询数据
List<City> list = selectAll();
//2找出顶级,从顶级开始递归向下塞children
List<City> listCity = list.stream().filter(city-> City.getLevelId().equals("0"))
.peek(user -> City.setChildList(getChildrens(City,list))).collect(Collectors.toList());
//3递归方法
public List<City> getChildrens(City city,List<City> cityList){
List<City> childrens = cityList.stream().filter(c -> Objects.equals(c.getLevelId(),city.getId())).map(
c -> {
c.setChildList(getChildrens(c,cityList));
return c;
}
).collect(Collectors.toList());
return childrens;
}
优点:简单易懂
缺点:性能中下
三、分开查询,分开设置
//查所有数据
//1.将所有数据分成不同的等级LIST
//2.根据每个等级分别设置该等级下的children
优点:一层一层数据量少,速度快
缺点:不够灵活代码多
四、直接查询数据给前端处理
优点:直接查出来交给前端做处理消耗客户端
缺点:需要和前端battle