/**
* 将存在树状结构的集合转换为存在层级关系的树状结构
*/
@Slf4j
public class CityListToTreeTest {
public static void main(String[] args) {
// 做源数据
String citysJsonStr = "[{\"name\":\"河北\",\"code\":\"hebei\",\"parent\":null},{\"name\":\"石家庄\",\"code\":\"shijiazhuang\",\"parent\":\"hebei\"}" +
",{\"name\":\"张家口\",\"code\":\"zhangjiakou\",\"parent\":\"hebei\"},{\"name\":\"邯郸\",\"code\":\"handan\",\"parent\":\"hebei\"}" +
",{\"name\":\"保定\",\"code\":\"baoding\",\"parent\":\"hebei\"},{\"name\":\"北京\",\"code\":\"beijing\",\"parent\":null}" +
",{\"name\":\"朝阳区\",\"code\":\"chaoyangqu\",\"parent\":\"beijing\"},{\"name\":\"海淀区\",\"code\":\"haidianqu\",\"parent\":\"beijing\"}]";
List<City> cities = JSONObject.parseArray(citysJsonStr, City.class);
log.info("citys is {}", JSONObject.toJSONString(cities));
// 转换
List<City> cityTree = cities.stream().filter(city -> ObjectUtils.isEmpty(city.getParent())).map(p -> {
p.setSubCity(getChildrens(p, cities));
return p;
}).collect(Collectors.toList());
// 输出
log.info("cityTree is {}", JSONObject.toJSONString(cityTree));
}
/**
* 制作存在树状关系的城市列表数据
*
* @return 城市列表
*/
private static List<City> getChildrens(City city, List<City> cities) {
return cities.stream().filter(subCity -> city.getCode().equals(subCity.getParent())).map(e -> {
getChildrens(e, cities);
return e;
}).collect(Collectors.toList());
}
}
/**
* 列表平铺的城市实体
*/
@Data
class City {
/**
* 城市编码
* 要求
*/
private String code;
/**
* 城市名称
* 要求
*/
private String name;
/**
* 上级城市编码
* <p>
* 一级城市(根节点) superiorCode 为 null <br/>
* 上下级关系通过 superiorCode 进行关联
* </p>
* 要求
*/
private String parent;
/**
* 下级城市
*/
private List<City> subCity;
}
java8 把存在树状结构的集合转换为存在层级关系的树状结构
最新推荐文章于 2023-02-16 11:23:50 发布