数据格式,省下面有多个城市,城市下面又有多个区,如下图是数据的格式
id,名称,父id(就是上一级的id,比如,南宁市是属于广西壮族自治区下的一个城市,那么南宁市对应的父id就是广西自治区的id)
代码具体实现
- 数据库表对应的实体
@Data public class Area { /**索引ID*/ private java.lang.Integer id; /**创建人*/ private java.lang.String createBy; /**创建时间*/ private java.util.Date createTime; /**修改人*/ private java.lang.String updateBy; /**修改时间*/ private java.util.Date updateTime; /**地区名称*/ private java.lang.String areaName; /**地区父ID*/ private java.lang.Integer areaParentId; /**邮政编码*/ private java.lang.String postcode; /**地区深度,从1开始*/ private java.lang.Integer areaDeep; }
- 创建一个实体类,用于数据封装,其中List<?> 中的 ?是一个泛型数据。
@Data
public class AreaVo {/**
* 索引ID
*/
private Integer id;
/**
* 地区名称
*/
private String areaName;
/**
* 地区父ID
*/
private Integer areaParentId;
private List<?> areas;
}
- 逻辑代码,涉及到 lambda 表达式;
public List<AreaVo> analyzeArea(List<Area> list) { //拿出所有的省级数据 List<Area> areas = list.stream().filter(f -> f.getAreaParentId() == 0) .collect(Collectors.toList()); List<AreaVo> p = new ArrayList<>(); for (Area area : areas) { //省份下的城市 List<Area> collect = list.stream().filter(f -> f.getAreaParentId().equals(area.getId())) .collect(Collectors.toList()); AreaVo areaVo = new AreaVo(); areaVo.setId(area.getId());//省id areaVo.setAreaName(area.getAreaName());//省名称 List<AreaVo> cityList = new ArrayList<>(); for (Area city : collect) { //城市下的所有区 List<Area> district = list.stream().filter(f -> f.getAreaParentId().equals(city.getId())) .collect(Collectors.toList()); List<AreaVo> vos = JSONUtil.toList(JSONUtil.parseArray(district), AreaVo.class); AreaVo c = new AreaVo(); c.setId(city.getId());//城市id c.setAreaName(city.getAreaName());//城市名称 c.setAreas(vos);//所有区 cityList.add(c); } //省城市 areaVo.setAreas(cityList); p.add(areaVo); } return p; }
- 调用方法
public Result<?> queryArea() { List<Area> list = areaService.list();//查询所有的的数据出来 List<AreaVo> vos = analyzeArea(list); return Result.ok(vos); }
public List<AreaVo> analyzeArea(List<Area> list) { //拿出所有的省级数据 List<Area> areas = list.stream().filter(f -> f.getAreaParentId() == 0) .collect(Collectors.toList()); List<AreaVo> p = new ArrayList<>(); for (Area area : areas) { //省份下的城市 List<Area> collect = list.stream().filter(f -> f.getAreaParentId().equals(area.getId())) .collect(Collectors.toList()); AreaVo areaVo = new AreaVo(); areaVo.setId(area.getId());//省id areaVo.setAreaName(area.getAreaName());//省名称 List<AreaVo> cityList = new ArrayList<>(); for (Area city : collect) { //城市下的所有区 List<Area> district = list.stream().filter(f -> f.getAreaParentId().equals(city.getId())) .collect(Collectors.toList()); List<AreaVo> vos = JSONUtil.toList(JSONUtil.parseArray(district), AreaVo.class); AreaVo c = new AreaVo(); c.setId(city.getId());//城市id c.setAreaName(city.getAreaName());//城市名称 c.setAreas(vos);//所有区 cityList.add(c); } //省城市 areaVo.setAreas(cityList); p.add(areaVo); } return p; }
封装完毕