有一个需求,因为涉及到了二个集合比较,二个集合都是 28-30 万数据,后续可能一个集合的数据会增加。 使用下面的方式去过滤,竟然 2 个小时都没返回,因此我想使用 removeAll 的方式。但是无法重写 equals 啊。想知道有没有特殊的写法。有大佬知道还有啥子效率高的写法么...
if (ArrayUtil.isEmpty(list2) || ArrayUtil.isEmpty(list1)) {
return list1;
}
List<Map> copyList = new ArrayList<>(list1);
//可能会有重复数据
Iterator<Map> it = copyList.iterator();
while (it.hasNext()) {
boolean flag = false;
Map map = it.next();
for (Map sendMap : list2) {
if (PartTool.getString(map, key, null).equals(PartTool.getString(sendMap, key, null))) {
flag = true;
break;
}
}
/** false , true
* 1.拿要插入的跟查出来的做比较 如果相同则从集合中剔除
* true,false
* 2.拿查询出来的根要插入的做比较 删掉一样的数据
*/
if (isDeleted && flag){
//如果不存在则剔除
it.remove();
}else if (!isDeleted && flag) {
//如果相同则不增加
it.remove();
}
/*if (flag) {
it.remove();
}*/
}
return copyList;
现在改成了这样
List<Map> reduceList = list1.stream().parallel().filter(item -> {
for (Map b : list2) {
return !b.get("INTERCEPT_ACCOUNT").equals(item.get("INTERCEPT_ACCOUNT"));
}
return true;
}).collect(toList());
return reduceList;
1
cryboy007 OP 换成下面那种,现在只要 10 秒不到了。舒服
|
2
dqzcwxb 2021-04-27 17:13:19 +08:00
还以为是双重循环改 map,结果还是笛卡尔积拉满改成并行
|
3
skyleft 2021-04-27 17:13:45 +08:00
改成的那个是不是有 bug 啊
|
5
cryboy007 OP @skyleft 这样子应该可以了。感觉还是挺菜的写法
```java List<Map> reduceList = list1.stream().parallel().filter(item -> { boolean flag = true; a: for (Map b : list2) { if (b.get("INTERCEPT_ACCOUNT").equals(item.get("INTERCEPT_ACCOUNT"))) { flag = false; break a; } } return flag; }).collect(toList()); return reduceList; ``` @dqzcwxb ..想不到好办法 |
6
dqzcwxb 2021-04-27 17:37:39 +08:00
|