今天写代码的一个需求,有一个List<User>存的所有用户,现在要在增强for中把不满足条件的User remove掉
因为前面好多判断已经写在增强for()中了,后面发现使用CopyOnWriteArrayList可以在增强for中正常remove。
结果集是List<User>类型的,无法强转为CopyOnWriteArrayList。最终把List<User>遍历了一下,然后放入CopyOnWriteArrayList,
再把List<User> clear(),再List<User> addAll(CopyOnWriteArrayList ) 哈哈,这效率得多低了。。。最终终于实现了。花了一整天。。。
上代码:
ParaGridResult<PrUser> result = this.userDao.queryPageList(userInfo,user);
if (result != null && result.getItems() != null
&& result.getItems().size() > 0) {
//线程安全的list
CopyOnWriteArrayList<PrUser> safelist=new CopyOnWriteArrayList<PrUser>();
for(PrUser user1:result.getItems()){
safelist.add(user1);
}
result.getItems().clear();
//List<PrUser> safelist=Collections.synchronizedList(result.getItems());
//CopyOnWriteArrayList<PrUser> safelist=(CopyOnWriteArrayList) result.getItems();
for (PrUser cuser : safelist) {
//获取应用账号
if(StringUtils.isNotEmpty(cuser.getId())){
ResAccountInfo resAccountInfo=new ResAccountInfo();
PrUser pruser=new PrUser();
pruser.setId(cuser.getId());
resAccountInfo.setUser(pruser);
//如果需要模糊查询应用账号
if(StringUtils.isNotEmpty(resAccount)){
String[] arr=resAccount.split(",");
resAccountInfo.setSearchKeys(arr);
//根据用户的id和模糊查询条件查出账号集合
ParaGridResult<PrResAccount> accResult=resAccountService.selectAccountByUserId(resAccountInfo);
//PrResAccount类型的结果集
List<PrResAccount> list=accResult.getItems();
//存放账号id的结果集
List<String> list1=new ArrayList();
//如果该用户有此账号
if(list!=null){
for(int i=0;i<list.size();i++){
list1.add(list.get(i).getAccountNo());
}
cuser.setResAccountNo(list1);
}else{
//如果没有该账号,需要将该记录一同移除
safelist.remove(cuser);
}
}else{
ParaGridResult<PrResAccount> accResult=resAccountService.selectAccountByUserId(resAccountInfo);
List<PrResAccount> list=accResult.getItems();//PrResAccount类型的结果集
List<String> list1=new ArrayList();//存放账号id的结果集
if(list!=null){
for(int i=0;i<list.size();i++){
list1.add(list.get(i).getAccountNo());
}
cuser.setResAccountNo(list1);
}
}
}
}
result.getItems().addAll(safelist);
}
return result;
写这个一方面是记录自己碰到的问题和解决的过程,另一方面就是要在增强for进行list的remove()操作,小伙伴记得用CopyOnWriteArrayList哦,他jdk1.5就有了。
后来又优化一下:
CopyOnWriteArrayList<String> removeIds=new CopyOnWriteArrayList();
//把要移除用户的id放入该list
//然后去增强for循环外remove
for(String id:removeIds){
Iterator<PrUser> it=result.iterator();
while(it.hasNext()){
if(id.equals(it.next.getId())){
it.remove();
}
}
}