业务场景:在别人调用我们接口保存数据的时候,而我们要通过传过来的数据在数据库中找出哪些数据是已经存在的,存在的做更新操作,不存在的做插入操作。在这种业务场景的时候可能你要用到,List<Map<String,Object>>去重复。
假如我们接收的数据json:
"{"goodsOrds":[{"dljgId\":"e9369b7bc2c149f690fbd1f1734cf78d","userId":null,"goodsCode":"sp125","serviceState":"0 "}].....}" ;
这串json数据,你把它解析成List<Map<String,Object>>,
例如
Map<String, Object> mapJson = JSONObject.fromObject(messageBody);
List<Map<String,Object>> list = (List<Map<String, Object>>) mapJson.get("goodsOrds");//这个是我们解析后的数据
//下面的操作是为了找出在数据库存在的记录,以便知道哪些数据是需要做更新操作的。
List<String> dljgIds = new ArrayList<String>();
for (Map<String, Object> map : list) {String dljgId = map.get("dljgId").toString();
dljgIds.add(dljgId);
}
List<Map<String, Object>> KhSpxxs = crmKhService.getKhSpxx(dljgIds);//这个是在数据库找出来的,也就是说着些数据是需要更新操作的,但是我们需要找到那些数据是需要插入数据库的,所以我们要比较这两个集合:list,KhSpxxs。
即list减去KhSpxxs就是需要做插入操作的数据。这里存在一个问题,如何比较Map<String,Object>是相同的呢?下面提供一种做法:通过构造一个map,然后通过key来识别map里面的对象是不是相同的对象。
/**
* list转map为了后面去重复,注意我们这边的dljgId是唯一的。
*/
Map<String,Map<String, Object>> updateKhSpxxMap = new HashMap<String, Map<String,Object>>();
Map<String,Map<String, Object>> updateJsonData = new HashMap<String, Map<String,Object>>();
for (Map<String, Object> map2 : updateKhSpxx) {
updateKhSpxxMap.put((String)map2.get("dljgId"), map2);
}
for (Map<String, Object> list : lists) {
updateJsonData.put((String)list.get("dljgId"), list);
}
for (Map.Entry<String, Map<String, Object>> entry: updateJsonData.entrySet()) {
String key = entry.getKey();
if(!updateKhSpxxMap.containsKey(key)){
Map<String, Object> insertKhSpxxMap = updateJsonData.get(key);
if(insertKhSpxxMap!=null&&insertKhSpxxMap.size()>0){
insertKhSpxxMap.put("cjsj",DateUtil.format(new Date(),"yyyy-MM-dd HH:mm:ss"));
isOk = crmKhDao.insertKhSpxx(insertKhSpxxMap);
}
}
}
假如是List<Pojo>的话,比较简单,只需要在对应pojo重写equals方法,指定参数,标识这个对应是唯一 的,然后在比较即可。