Java Stream filter 报错 ConcurrentModificationException 解决方法
Java Stream filter 报错 ConcurrentModificationException 解决方法
在使用Java Stream的filter方法对集合进行过滤操作时,如果在过滤过程中尝试修改原始集合,就会抛出ConcurrentModificationException异常。这是因为Stream的实现机制是基于迭代器,而迭代器不允许在迭代过程中修改集合。
例如,下面的代码会抛出ConcurrentModificationException异常:javaList
new Vector<>(list).stream().filter(vo -> { if (/* 某些条件 */) { list.remove(vo); // 在这里修改了原始集合 } return ids.contains(vo.getId());}).toList();
解决方法:
要解决这个问题,可以使用collect方法将过滤后的元素收集到一个新的集合中,而不是直接修改原始集合。可以使用Collectors.toList()方法将元素收集到一个新的List中,示例如下:javaList
这样就可以避免ConcurrentModificationException异常。
原理:
collect方法会将Stream的元素收集到一个新的集合中,而不是修改原始集合。因此,在使用filter方法过滤元素时,即使不使用collect方法,也不会抛出ConcurrentModificationException异常。
总结:
为了避免ConcurrentModificationException异常,建议在使用Stream的filter方法过滤元素时,使用collect方法将过滤后的元素收集到一个新的集合中。
原文地址: https://www.cveoy.top/t/topic/dQ8R 著作权归作者所有。请勿转载和采集!