遍历List执行add/remove的坑与建议

遍历List执行add/remove的坑与建议

相信大家肯定都碰到过这样的业务场景。现在有一组学生成绩List,需要筛选出成绩大于90分的名单,肯定有部分人会这么做,代码如下;

1、学生类
public class Student {

	private Integer score;

	private String name;

	public Integer getScore() {
		return score;
	}

	public void setScore(Integer score) {
		this.score = score;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Student(Integer score, String name) {
		super();
		this.score = score;
		this.name = name;
	}

	@Override
	public String toString() {
		return "Student [score=" + score + ", name=" + name + "]";
	}

}

2、测试代码
public // 测试类
class Test {

	public static void main(String[] args) {
		// 需求:初始化一批学生的成绩,然后筛选出成绩大于90分的人
		List<Student> students = new ArrayList<>();
		students.add(new Student(54, "小明"));
		students.add(new Student(98, "小红"));
		students.add(new Student(67, "小刚"));
		students.add(new Student(120, "小芳"));
		students.add(new Student(99, "小陈"));
		students.add(new Student(89, "小张"));
		students.add(new Student(90, "小李"));
		students.add(new Student(100, "小王"));
		students.add(new Student(54, "小强"));
		students.add(new Student(95, "小刘"));
		
		for(Student student: students) {
			if(student.getScore() < 90) {
				students.remove(student);
			}
		}
		
		System.out.println(students);
	}

}

你一定觉得这就OK了。很不幸,报异常了!
Exception in thread "main" java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(Unknown Source) at java.util.ArrayList$Itr.next(Unknown Source) at test01.java01.Test.main(Test.java:30)
这是为什么呢?因为foreach循环底层是依赖迭代器的,这里调用remove/add方法则直接将当前迭代器改动了,所以就类设计者主动抛出了并发异常。

3、解决方法
3.1、 用迭代器自身的remove/add方法实现操作
Iterator<Student> iterator = students.iterator();
		while(iterator.hasNext()) {
			if(iterator.next().getScore() < 90) {
				iterator.remove();
			}
		}
3.2、 用for(i=0;i <list.size();i++)来实现操作
for(int i = 0; i < students.size(); i++) {
			if(students.get(i).getScore() < 90) {
				students.remove(i);
			}
		}
3.3、采用stream的filter实现
students = students.stream().filter(x -> x.getScore() >= 90).collect(Collectors.toList());
3.4、使用Collection的removeIf()方法来实现
students.removeIf(x -> x.getScore() < 90);

正常返回结果:

[Student [score=98, name=小红], Student [score=120, name=小芳], Student [score=99, name=小陈], Student [score=90, name=小李], Student [score=100, name=小王], Student [score=95, name=小刘]]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值