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传参极易出现转换问题。与弊端相比,所谓的便利性可以忽略。