实际的业务项目开发中,大家应该对 从给定的list中剔除不满足条件的元素 这个操作不陌生吧?
很多同学可以立刻想出很多种实现的方式,但你想到的这些实现方式都是 人畜无害 的吗?很多看似正常的操作其实背后是个陷阱,很多新手可能稍不留神就会掉入其中。
倘若不幸踩中:
-
代码运行时直接抛异常报错,这个算是不幸中的万幸,至少可以及时发现并去解决
-
代码运行不报错,但是业务逻辑莫名其妙的出现各种奇怪问题,这种就比较悲剧了,因为这个问题稍不留神的话,可能就会给后续业务埋下隐患。
那么,到底有哪些实现方式呢?哪些实现方式可能会存在问题呢?这里我们一起探讨下。注意哦,这里讨论的可不是茴香豆的“茴”字有有种写法的问题,而是很严肃很现实也很容易被忽略的技术问题。
假设需求场景:
给定一个用户列表allUsers,需要从该列表中剔除隶属部门为dev的人员,将剩余的人员信息返回
踩坑操作
foreach循环剔除方式
很多新手的第一想法就是for循环逐个判断校验下然后符合条件的剔除掉就行了嘛~ so easy...
1分钟就把代码写完了:
public List<UserDetail> filterAllDevDeptUsers(List<UserDetail> allUsers) { for (UserDetail user : allUsers) { // 判断部门如果属于dev,则直接剔除 if ("dev".equals(user.getDepartment())) { allUsers.remove(user); } } // 返回剩余的用户数据 return allUsers; }
然后信心满满的点击了执行按钮:
java.util.ConcurrentModificationException: null at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909) at java.util.ArrayList$Itr.next(ArrayList.java:859) at com.veezean.demo4.UserService.filterAllDevDeptUsers(UserService.java:13) at com.veezean.demo4.Main.main(Main.java:26)
诶? what are you 弄啥嘞?咋抛异常了?