有這么個場景,每天需要定時任務插入增量數據。如果通過接口獲取的直接根據時間過濾,那么就能直接就可以插入庫中。但有時獲取到的並不是增量數據,比如微信公眾號獲取關注者列表時,獲取到的是全量數據,這樣每天就得將全量數據與庫中進行比較,只有庫中不存在數據才進行插入。這就有了兩個list比較差值的問題。
以前在處理該問題時,會遍歷全量中的list,然后判斷每個對象是否已在數中存在,如果不存在就放到一個臨時List中,最后返回的臨時List就是增量數據了,代碼如下:
private List<String> getNeedAddOpenidList(List<String> allOpenidList, List<String> dbOpenidList) {
if (dbOpenidList != null && !dbOpenidList.isEmpty()) {
List<String> resultList = new ArrayList<String>();
if (allOpenidList != null && !allOpenidList.isEmpty()) {
for (String openid : allOpenidList) {
if (!dbOpenidList.contains(openid)) {
resultList.add(openid);
}
}
}
return resultList;
} else {
return allOpenidList;
}
}
但這種在處理幾千條數據還好,等上萬、或上十萬時,執行效率就會很低。即便我后來用list1.removeAll(list2)時,在處理40萬條數據時,10分鍾根本處理不完。
后來用如下方法,瞬間完成:
private List<String> getNeedAddOpenidList(List<String> allOpenidList, List<String> dbOpenidList) {
if (dbOpenidList != null && !dbOpenidList.isEmpty()) {
Map<String, String> dataMap = new HashMap<String, String>();
for (String id : dbOpenidList) {
dataMap.put(id, id);
}
List<String> newList = new ArrayList<String>();
for (String id : allOpenidList) {
if (!dataMap.containsKey(id)) {
newList.add(id);
}
}
return newList;
} else {
return allOpenidList;
}
}
1.將數據庫中的list轉成一個map集合
2.遍歷獲取到的全量數據,通過主鍵或唯一索引之類的字段進行比較
3.如果map.get(key)不存在,放到一個臨時List中
4.最后將臨時List返回
如果以后有更高效率的方法,還會進行更新