Java Stream filter 报错 ConcurrentModificationException 解决方法

在使用Java Stream的filter方法对集合进行过滤操作时,如果在过滤过程中尝试修改原始集合,就会抛出ConcurrentModificationException异常。这是因为Stream的实现机制是基于迭代器,而迭代器不允许在迭代过程中修改集合。

例如,下面的代码会抛出ConcurrentModificationException异常:javaList list = new Vector<>();// ... 初始化 list ...

new Vector<>(list).stream().filter(vo -> { if (/* 某些条件 */) { list.remove(vo); // 在这里修改了原始集合 } return ids.contains(vo.getId());}).toList();

解决方法:

要解决这个问题,可以使用collect方法将过滤后的元素收集到一个新的集合中,而不是直接修改原始集合。可以使用Collectors.toList()方法将元素收集到一个新的List中,示例如下:javaList filteredList = new Vector<>(list) .stream() .filter(vo -> ids.contains(vo.getId())) .collect(Collectors.toList());

这样就可以避免ConcurrentModificationException异常。

原理:

collect方法会将Stream的元素收集到一个新的集合中,而不是修改原始集合。因此,在使用filter方法过滤元素时,即使不使用collect方法,也不会抛出ConcurrentModificationException异常。

总结:

为了避免ConcurrentModificationException异常,建议在使用Stream的filter方法过滤元素时,使用collect方法将过滤后的元素收集到一个新的集合中。

Java Stream filter 报错 ConcurrentModificationException 解决方法

原文地址: https://www.cveoy.top/t/topic/dQ8R 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录