List.add 方法添加元素时只会添加最后一条元素的分析解决
前言
一、问题描述
- 模拟代码片如下
//模拟请求 Map<String, Object> requestMap = new HashMap<>(); requestMap.put("id", ""); requestMap.put("passwd", ""); requestMap.put("userName", ""); //模拟结果集 Map<String, Object> resultMap = new HashMap<>(); resultMap.put("id", "1"); resultMap.put("passwd", "odd taxi"); resultMap.put("userName", "小早川"); Map<String, Object> resultMap2 = new HashMap<>(); resultMap2.put("id", "2"); resultMap2.put("passwd", "Brazilian war dance"); resultMap2.put("userName", "白川"); List<Map<String, Object>> resultListMap = new ArrayList<>(); resultListMap.add(resultMap); resultListMap.add(resultMap2); //模拟响应 List<Map<String, Object>> responseListMap = new ArrayList<>(); Map<String, Object> responseMap = new HashMap<>(); // 实现: 根据请求map中的 key, 返回所有结果集中含有请求map所带k的list.map集合 for (Map<String, Object> resMap : resultListMap) { requestMap.forEach((k, v) -> { responseMap.put(k, resMap.get(k)); }); responseListMap.add(responseMap); } System.out.println("responseListMap = " + responseListMap);
- 结果演示
可以看到, 在上面结果集 resultListMap遍历过程中, 我们根据请求 requestMap的key 去结果集中寻找key对应的value
然后放入 responseMap, 因为结果集map 不止一个, 所以将其放入list 中.
但是, 最后返回的list 中只有两条相同的数据, 而且都是最后插入的一条数据
二、原因分析
1.简化分析
- 为了将原来的问题简化, 我们可以在把问题简化下, 下面是简化之后的代码
List<User> userList = new ArrayList<>(2);
User u1 = new User();
for (int i = 0; i < 5; i++) {
u1.setId(i);
u1.setPwd("odd taxi"+ i);
u1.setUsername("小早川"+ i);
userList.add(u1);
}
for (User user : userList) {
System.out.println("user = " + user);
}
-
由下图可知
list.add 通过遍历去调用, 又是只加入最后一条元素, 而且遍历几遍就有几条相同的元素
-
对上述代码进行断点调试
由我们对每次循环对象属性和 userList 中属性对比可知:
在每次循环结束后, userList 中所有的数据都会变成最后一次遍历数据*遍历次数
- 基于上述分析, 我们先修改简化版代码: 只需将对象初始化放在循环内即可
List<User> userList = new ArrayList<>(2);
User u1 ;
for (int i = 0; i < 5; i++) {
u1 = new User();
u1.setId(i);
u1.setPwd("odd taxi"+ i);
u1.setUsername("小早川"+ i);
userList.add(u1);
}
for (User user : userList) {
System.out.println("user = " + user);
}
2.回归本题
- 修改前
//---------------------修改前---------------------
//模拟请求
Map<String, Object> requestMap = new HashMap<>();
requestMap.put("id", "");
requestMap.put("passwd", "");
requestMap.put("userName", "");
//模拟结果集
Map<String, Object> resultMap = new HashMap<>();
resultMap.put("id", "1");
resultMap.put("passwd", "odd taxi");
resultMap.put("userName", "小早川");
Map<String, Object> resultMap2 = new HashMap<>();
resultMap2.put("id", "2");
resultMap2.put("passwd", "Brazilian war dance");
resultMap2.put("userName", "白川");
List<Map<String, Object>> resultListMap = new ArrayList<>();
resultListMap.add(resultMap);
resultListMap.add(resultMap2);
//模拟响应
List<Map<String, Object>> responseListMap = new ArrayList<>();
Map<String, Object> responseMap = new HashMap<>();
// 实现: 根据请求map中的 key, 返回所有结果集中含有请求map所带k的list.map集合
for (Map<String, Object> resMap : resultListMap) {
requestMap.forEach((k, v) -> {
responseMap.put(k, resMap.get(k));
});
responseListMap.add(responseMap);
}
System.out.println("responseListMap = " + responseListMap);
- 修改后
//---------------------修改后---------------------
//模拟请求
Map<String, Object> requestMap = new HashMap<>();
requestMap.put("id", "");
requestMap.put("passwd", "");
requestMap.put("userName", "");
//模拟结果集
Map<String, Object> resultMap = new HashMap<>();
resultMap.put("id", "1");
resultMap.put("passwd", "odd taxi");
resultMap.put("userName", "小早川");
Map<String, Object> resultMap2 = new HashMap<>();
resultMap2.put("id", "2");
resultMap2.put("passwd", "Brazilian war dance");
resultMap2.put("userName", "白川");
List<Map<String, Object>> resultListMap = new ArrayList<>();
resultListMap.add(resultMap);
resultListMap.add(resultMap2);
//模拟响应
List<Map<String, Object>> responseListMap = new ArrayList<>();
// 实现: 根据请求map中的 key, 返回所有结果集中含有请求map所带k的list.map集合
for (Map<String, Object> resMap : resultListMap) {
// 问题修改: 将 list 需要 add 的对象/集合 放到循环内进行初始化!!!
Map<String, Object> responseMap = new HashMap<>();
requestMap.forEach((k, v) -> {
responseMap.put(k, resMap.get(k));
});
responseListMap.add(responseMap);
}
System.out.println("responseListMap = " + responseListMap);
- 可以看出仅仅是将list 中需要 add 的集合 responseMap 的初始化放到循环内, 问题就得到解决, 如下图所示
总结
参考: https://blog.csdn.net/ww77889126/article/details/84952631