关于list相关操作的一些心得
因为时间关系,本文没有深入探究底层代码原因,只是简单记录一些使用心得,但万变不离其宗,其原因大概也是能想到的。
场景
因业务需求,要求对多个不同list去重。
其中包括 :
- List<String/int/long/…> 与List<String/int/long/…>之间去重;
- List<对象> 与List<String/int/long/…>之间去重;
- List<对象> 与List<对象>之间去重;(暂不探讨,看需求转化)
方法
1、List<String/int/long/…> 与List之间去重
这类情况最简单,使用list自带的remove即可。
listA.removeAll(listB);
2、 List<对象> 与List之间去重
这里出现了坑,不能使用remove方法,无论是remove(object)还是remove(index)可能会出现错位、部分去重,或者抛出java.util.ConcurrentModificationException。
这里需要借助Iterator迭代器。以User为例:
//去重
Iterator<User> iterator = mlzbList.iterator();
while (iterator.hasNext()) {
User user = (User) iterator.next();
if (ifcontains(userIds, user )) {
LOGGER.info("user 表remove的命令ID: {}",user .getMlId());
iterator.remove();
}
}
private boolean ifcontains(List<String> userIds, User user) {
boolean res = false;
for(String id : userIds){
if(id.equals(user.getMlId().replace(" ", ""))){
res = true;
return res;
}
}
return res;
}
其他小技巧
list对象提取 某个字段list方法
userList.stream().map(User->User.getMlId()).collect(Collectors.toList())
以上