从永远到永远-Map传值的坑map.values()

Map传值的坑map.values

1.需求

将某接口中返回的数组,根据某字段进行排序取前三条。为不与原处理逻辑耦合(不想看祖传代码,更不想在祖传代码中留下操作痕迹),直接在返回数据前,将数组取出排序,重新设置进去。
结果,正因为没有仔细看代码并且对这个世界怀揣美好的幻想,程序华丽丽地报错了。

2.错误

java.lang.ClassCastException: java.util.HashMap$Values cannot be cast to java.util.List

浅显易懂,hashMap的values不能转成List。忍着恶心,我看了看代码。说真的,我还是低估一个同事的想象力。map封装反参,就算了。这个数组,不是List不是数组。而是先将n个map封装到一个map中,之后将map.values()封装到了返回数组中。如图,示例代码:
在这里插入图片描述

3.解决

看下源码,map.values返回的是Collection。
在这里插入图片描述
那就先转成Collection。处理如下
在这里插入图片描述
完整实例代码

Map<String, Object> returnMap = new HashMap<>();
        Map<String, Map<String, Object>> maps = new HashMap<>();
        Map<String, Object> map1 = new HashMap<>();
        map1.put("name", "张三");
        map1.put("age", 30);
        maps.put("map1", map1);
        Map<String, Object> map2 = new HashMap<>();
        map2.put("name", "李四");
        map2.put("age", 29);
        maps.put("map2", map2);
        Map<String, Object> map3 = new HashMap<>();
        map3.put("name", "陈六");
        map3.put("age", 27);
        maps.put("map3", map3);
        Map<String, Object> map4 = new HashMap<>();
        map4.put("name", "王五");
        map4.put("age", 28);
        maps.put("map4", map4);

        returnMap.put("detail", maps.values());
        returnMap.put("code", "200");
        returnMap.put("msg", "查询成功");
        log.info("【MapBitchSample】【test】返回值:{}", JSON.toJSONString(returnMap));
        //List<Map<String, Object>> listToHandle = (List<Map<String, Object>>) returnMap.get("detail");
        Collection<Map<String, Object>> collection = (Collection<Map<String, Object>>) returnMap.get("detail");
        List<Map<String, Object>> list = new ArrayList<>(collection);
        list.sort((o1, o2) -> o2.get("age").toString().compareTo(o1.get("age").toString()));
        returnMap.put("detail", list.subList(0, 3));
        log.info("【MapBitchSample】【test】返回值:{}", JSON.toJSONString(returnMap));

4.注意

不使用map传参,使用领域对象封装参数。map虽然在增加字段时有一定的便利性。但是极其不利于维护,而且map传参极易出现转换问题。与弊端相比,所谓的便利性可以忽略。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值