java省市区三级联动

最近徒弟在写省市区的三级联动,特此记录。

数据格式为树形,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

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值