java computeIfAbsent 处理mysql获取树形的数据

2 篇文章 0 订阅

学习了《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对数据进行汇集,这样处理树形的数据就变得简单了。如果是对象类型的数据,处理起来就更简单了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天狼1222

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值