学习了《java 处理mysql获取树形的数据》,这个还是比较复杂,在学了map的 computeIfAbsent的方法,发现可以用来处理树形数据
直接上代码:
代码:
map:
public static void main(String args[]) {
JSONArray datas = initData();
List<Map<String, Object>> treeDatas = parseTreeModel(datas);
System.out.println(JSON.toJSONString(treeDatas));
}
public static List<Map<String, Object>> parseTreeModel(JSONArray datas){
Map<String, List<Map<String, Object>>> map = new HashMap<>();
List<Map<String, Object>> results = ListUtils.emptyIfNull(datas).stream().map(e -> (Map<String, Object>) e).collect(Collectors.toList());
ListUtils.emptyIfNull(results).stream().map(e -> (JSONObject)e).forEach(x -> {
String parentCode = MapUtils.getString(x, "parentCode");
if (StringUtils.isBlank(parentCode)) {
parentCode = "-1";
}
// 如果 parentCode 没有值,生成空数组,
List<Map<String, Object>> list = map.computeIfAbsent(parentCode, k -> new ArrayList<>());
// 如果有值,就把值取出来,相同的parentCode 放到一起
list.add(x);
});
System.out.println("======= computeIfAbsent data =======");
System.out.println(JSON.toJSONString(map));
// 从-1开始遍历
List<Map<String, Object>> beiginResult = map.getOrDefault("-1", new ArrayList<>());
parseChildrenTreeModel(map, beiginResult);
System.out.println("======= parseChildrenTreeModel =======");
return beiginResult;
}
// getOrDefault() 方法获取指定 key 对应对 value,如果找不到 key ,则返回设置的默认值。
private static void parseChildrenTreeModel(Map<String, List<Map<String, Object>>> map, List<Map<String, Object>> datas) {
datas.forEach(x -> {
x.put("children", map.getOrDefault(MapUtils.getString(x, "code"), new ArrayList<>()));
List<Map<String, Object>> children = (List<Map<String, Object>>) x.get("children");
if (!CollectionUtils.isEmpty(children)) {
parseChildrenTreeModel(map, children);
}
});
}
private static JSONArray initData(){
String data = "[{\n" +
"\t\t\"code\": 59,\n" +
"\t\t\"parentCode\": -1,\n" +
"\t\t\"name\": \"福建\"\n" +
"\t},\n" +
"\t{\n" +
"\t\t\"code\": 591,\n" +
"\t\t\"parentCode\": 59,\n" +
"\t\t\"name\": \"福州\"\n" +
"\t},\n" +
"\t{\n" +
"\t\t\"code\": 59101,\n" +
"\t\t\"parentCode\": 591,\n" +
"\t\t\"name\": \"鼓楼区\"\n" +
"\t},\n" +
"\t{\n" +
"\t\t\"code\": 59195,\n" +
"\t\t\"parentCode\": 591,\n" +
"\t\t\"name\": \"晋安区\"\n" +
"\t},\n" +
"\t{\n" +
"\t\t\"code\": 59196,\n" +
"\t\t\"parentCode\": 591,\n" +
"\t\t\"name\": \"马尾区\"\n" +
"\t},\n" +
"\t{\n" +
"\t\t\"code\": 59197,\n" +
"\t\t\"parentCode\": 591,\n" +
"\t\t\"name\": \"台江区\"\n" +
"\t},\n" +
"\t{\n" +
"\t\t\"code\": 59198,\n" +
"\t\t\"parentCode\": 591,\n" +
"\t\t\"name\": \"金山区\"\n" +
"\t},\n" +
"\t{\n" +
"\t\t\"code\": 592,\n" +
"\t\t\"parentCode\": 59,\n" +
"\t\t\"name\": \"厦门\"\n" +
"\t},\n" +
"\t{\n" +
"\t\t\"code\": 59201,\n" +
"\t\t\"parentCode\": 592,\n" +
"\t\t\"name\": \"思明区\"\n" +
"\t},\n" +
"\t{\n" +
"\t\t\"code\": 59202,\n" +
"\t\t\"parentCode\": 592,\n" +
"\t\t\"name\": \"同安\"\n" +
"\t},\n" +
"\t{\n" +
"\t\t\"code\": 59203,\n" +
"\t\t\"parentCode\": 592,\n" +
"\t\t\"name\": \"杏林\"\n" +
"\t},\n" +
"\t{\n" +
"\t\t\"code\": 59204,\n" +
"\t\t\"parentCode\": 592,\n" +
"\t\t\"name\": \"海沧区\"\n" +
"\t},\n" +
"\t{\n" +
"\t\t\"code\": 59205,\n" +
"\t\t\"parentCode\": 592,\n" +
"\t\t\"name\": \"同安区\"\n" +
"\t},\n" +
"\t{\n" +
"\t\t\"code\": 59206,\n" +
"\t\t\"parentCode\": 592,\n" +
"\t\t\"name\": \"翔安区\"\n" +
"\t},\n" +
"\t{\n" +
"\t\t\"code\": 593,\n" +
"\t\t\"parentCode\": 59,\n" +
"\t\t\"name\": \"宁德\"\n" +
"\t},\n" +
"\t{\n" +
"\t\t\"code\": 59301,\n" +
"\t\t\"parentCode\": 593,\n" +
"\t\t\"name\": \"宁德\"\n" +
"\t},\n" +
"\t{\n" +
"\t\t\"code\": 59302,\n" +
"\t\t\"parentCode\": 593,\n" +
"\t\t\"name\": \"古田\"\n" +
"\t},\n" +
"\t{\n" +
"\t\t\"code\": 59303,\n" +
"\t\t\"parentCode\": 593,\n" +
"\t\t\"name\": \"屏南\"\n" +
"\t},\n" +
"\t{\n" +
"\t\t\"code\": 59304,\n" +
"\t\t\"parentCode\": 593,\n" +
"\t\t\"name\": \"寿宁\"\n" +
"\t},\n" +
"\t{\n" +
"\t\t\"code\": 59305,\n" +
"\t\t\"parentCode\": 593,\n" +
"\t\t\"name\": \"周宁\"\n" +
"\t}]";
return JSON.parseArray(data);
}
对象类型:
public static void main(String[] args){
List<TreeModel> areaList = initData();
// 构建树形
List<TreeModel> treeModels = parseTreeModel(areaList);
System.out.println("result: "+ JSON.toJSONString(treeModels));
}
private static List<TreeModel> parseTreeModel(List<TreeModel> treeModels) {
if (CollectionUtils.isEmpty(treeModels)) {
return Collections.emptyList();
}
Map<String, List<TreeModel>> map = new HashMap<>();
treeModels.forEach(x -> {
String parentCode = x.getParentCode();
if (StringUtils.isBlank(parentCode)) {
parentCode = "-1";
}
// 如果 parentCode 没有值,生成空数组,
List<TreeModel> list = map.computeIfAbsent(parentCode, k -> new ArrayList<>());
// 如果有值,就把值取出来,相同的parentCode 放到一起
list.add(x);
});
// 从-1开始遍历
List<TreeModel> result = map.getOrDefault("-1", new ArrayList<>());
parseChildrenTreeModel(map, result);
return result;
}
private static void parseChildrenTreeModel(Map<String, List<TreeModel>> map, List<TreeModel> treeModels) {
treeModels.forEach(x -> {
x.setChildren(map.getOrDefault(x.getCode(), new ArrayList<>()));
if (!CollectionUtils.isEmpty(x.getChildren())) {
parseChildrenTreeModel(map, x.getChildren());
}
});
}
private static List<TreeModel> initData(){
String areaInfo = "[{\n" +
"\t\t\"code\": 59,\n" +
"\t\t\"parentCode\": -1,\n" +
"\t\t\"name\": \"福建\"\n" +
"\t},\n" +
"\t{\n" +
"\t\t\"code\": 591,\n" +
"\t\t\"parentCode\": 59,\n" +
"\t\t\"name\": \"福州\"\n" +
"\t},\n" +
"\t{\n" +
"\t\t\"code\": 59101,\n" +
"\t\t\"parentCode\": 591,\n" +
"\t\t\"name\": \"鼓楼区\"\n" +
"\t},\n" +
"\t{\n" +
"\t\t\"code\": 59195,\n" +
"\t\t\"parentCode\": 591,\n" +
"\t\t\"name\": \"晋安区\"\n" +
"\t},\n" +
"\t{\n" +
"\t\t\"code\": 59196,\n" +
"\t\t\"parentCode\": 591,\n" +
"\t\t\"name\": \"马尾区\"\n" +
"\t},\n" +
"\t{\n" +
"\t\t\"code\": 59197,\n" +
"\t\t\"parentCode\": 591,\n" +
"\t\t\"name\": \"台江区\"\n" +
"\t},\n" +
"\t{\n" +
"\t\t\"code\": 59198,\n" +
"\t\t\"parentCode\": 591,\n" +
"\t\t\"name\": \"金山区\"\n" +
"\t},\n" +
"\t{\n" +
"\t\t\"code\": 592,\n" +
"\t\t\"parentCode\": 59,\n" +
"\t\t\"name\": \"厦门\"\n" +
"\t},\n" +
"\t{\n" +
"\t\t\"code\": 59201,\n" +
"\t\t\"parentCode\": 592,\n" +
"\t\t\"name\": \"思明区\"\n" +
"\t},\n" +
"\t{\n" +
"\t\t\"code\": 59202,\n" +
"\t\t\"parentCode\": 592,\n" +
"\t\t\"name\": \"同安\"\n" +
"\t},\n" +
"\t{\n" +
"\t\t\"code\": 59203,\n" +
"\t\t\"parentCode\": 592,\n" +
"\t\t\"name\": \"杏林\"\n" +
"\t},\n" +
"\t{\n" +
"\t\t\"code\": 59204,\n" +
"\t\t\"parentCode\": 592,\n" +
"\t\t\"name\": \"海沧区\"\n" +
"\t},\n" +
"\t{\n" +
"\t\t\"code\": 59205,\n" +
"\t\t\"parentCode\": 592,\n" +
"\t\t\"name\": \"同安区\"\n" +
"\t},\n" +
"\t{\n" +
"\t\t\"code\": 59206,\n" +
"\t\t\"parentCode\": 592,\n" +
"\t\t\"name\": \"翔安区\"\n" +
"\t},\n" +
"\t{\n" +
"\t\t\"code\": 593,\n" +
"\t\t\"parentCode\": 59,\n" +
"\t\t\"name\": \"宁德\"\n" +
"\t},\n" +
"\t{\n" +
"\t\t\"code\": 59301,\n" +
"\t\t\"parentCode\": 593,\n" +
"\t\t\"name\": \"宁德\"\n" +
"\t},\n" +
"\t{\n" +
"\t\t\"code\": 59302,\n" +
"\t\t\"parentCode\": 593,\n" +
"\t\t\"name\": \"古田\"\n" +
"\t},\n" +
"\t{\n" +
"\t\t\"code\": 59303,\n" +
"\t\t\"parentCode\": 593,\n" +
"\t\t\"name\": \"屏南\"\n" +
"\t},\n" +
"\t{\n" +
"\t\t\"code\": 59304,\n" +
"\t\t\"parentCode\": 593,\n" +
"\t\t\"name\": \"寿宁\"\n" +
"\t},\n" +
"\t{\n" +
"\t\t\"code\": 59305,\n" +
"\t\t\"parentCode\": 593,\n" +
"\t\t\"name\": \"周宁\"\n" +
"\t}]";
JSONArray areaArr = JSONArray.parseArray(areaInfo);
return ListUtils.emptyIfNull(areaArr).stream().map(e -> (JSONObject) e)
.map(e -> JSONObject.parseObject(e.toString(), TreeModel.class)).collect(Collectors.toList());
}
分析:
// 如果 parentCode 没有值,生成空数组,
List<Map<String, Object>> list = map.computeIfAbsent(parentCode, k -> new ArrayList<>());
// 如果有值,就把值取出来,相同的parentCode 放到一起
list.add(x);
先把有相同parentCode的内容放到一起,这样在遍历的时候,就可以直接map.get("code")获取到对应的子集了,再不断进行调用。
总结:
使用 map.computeIfAbsent对数据进行汇集,这样处理树形的数据就变得简单了。如果是对象类型的数据,处理起来就更简单了。