@Data
@ToString
public class DomesticRegionResp {
private Integer codeId; //ID
private Integer parentId; //父级ID
private String cityName; //名称
private List<DomesticRegionResp> child; //子级元素集合
}
/**
* @Description 省 -> 市 -> 县
* 由于频繁请求数据库,取得全部省市县数据数据较慢,因此将数据全部取出交给JVM进行处理。
* 于是进行三层封装数据处理。
* 尝试一: 正常的数据过滤处理,最后执行打印语句时,出现堆栈溢出异常。
* 尝试二:每次查询到一组数据后,在原List数组中删除已查询数据。这样实现查询次数的锐减。
*/
@Test
public void getProvinceInfo(){
List<DomesticRegionResp> list = domesticRegionMapper.selectList(); //查出所有数据
// 步骤一:获取省份或者直辖市,获取成功后删除获取到的信息 (第一级)
List<DomesticRegionResp> provinceList = list.stream().filter(f -> f.getParentId() == 0) //指出数据中所有id 等于fuid
.collect(Collectors.toList());
list.removeIf( f -> f.getParentId() == 0);
// 步骤二: 根据省份获取市级或者区级信息 (第二级)
for (DomesticRegionResp province : provinceList) {
List<DomesticRegionResp> cityList = list.stream().filter(f -> f.getParentId().equals(province.getCodeId()))
.collect(Collectors.toList());
list.removeIf( f -> f.getParentId().equals(province.getCodeId()));
// 步骤三: 根据市级ID取得县信息或者区信息 (第三级)
for (DomesticRegionResp city : cityList) {
List<DomesticRegionResp> townList = list.stream().filter(f -> f.getParentId().equals(city.getCodeId()))
.collect(Collectors.toList());
list.removeIf( f -> f.getParentId().equals(city.getCodeId()));
//将县/镇放入 区/市行政区内
city.setChild(townList);
}
province.setChild(cityList);
}
System.out.println(provinceList);
}
循环方式
/**
* @Description 省 -> 市 -> 县
* 由于频繁请求数据库,取得全部省市县数据数据较慢,因此将数据全部取出交给JVM进行处理。
* 于是进行三层封装数据处理。
* 尝试一: 正常的数据过滤处理,最后执行打印语句时,出现堆栈溢出异常。
* 尝试二:每次查询到一组数据后,在原List数组中删除已查询数据。这样实现查询次数的锐减。
* 尝试三:递归
*/
@Test
public void getProvinceInfo(){
List<DomesticRegionResp> list = domesticRegionMapper.selectList();
recursive(list);
}
/**
* @Description 递归
*/
public void recursive(List<DomesticRegionResp> list){
long start = System.currentTimeMillis();
//过滤出第一层
List<DomesticRegionResp> first =
list.stream().filter(region -> region.getParentId() == 0)
.collect(Collectors.toList());
list.removeIf( f -> f.getParentId() == 0);
//第二三层递归 调用函数generateRegion 返回的集合封装到regin中
first.forEach(region -> region.setChild(generateRegion(region.getCodeId(), list)));
long end = System.currentTimeMillis();
System.out.println("递归运行时间: " + (end - start));
}
//返回封装的集合
public List<DomesticRegionResp> generateRegion(int parentId, List<DomesticRegionResp> list){
return list.stream()
.filter(region -> region.getParentId() == parentId)
.peek(region -> region.setChild(generateRegion(region.getCodeId(), list)))
.collect(Collectors.toList());
}