假设您要过滤List中的元素。运行此代码会触发类似并发异常的事情,因为在循环期间正在修改列表:
List<String> aList = new ArrayList<String>();
// Add instances to list here ...
for( String s : aList ){
if( "apple".equals( s ) ){ // Criteria
aList.remove(s);
}
}
这样做的传统方式是什么?你知道其他什么方法?
答案 0 :(得分:3)
最好的方法是使用iterator.remove()
答案 1 :(得分:1)
对于您的情况,您可以简单地使用解决方案而无需手动完成任何迭代(removeAll会关注此问题):
aList.removeAll("apple");
它会从列表中删除所有“apple”元素。
答案 2 :(得分:1)
如果您正在迭代或拥有简单元素的集合,请同意上述两个。如果您的条件或对象涉及更多,请考虑使用Apache Commons CollectionUtils的过滤器方法,该方法允许您定义封装条件的谓词,然后将其应用于集合的每个元素。给定您的集合aList和谓词applePredicate,调用方法将是:
org.apache.commons.collections.CollectionUtils.filter(aList,applePredicate);
http://commons.apache.org/collections/apidocs/org/apache/commons/collections/CollectionUtils.html#filter(java.util.Collection,org.apache.commons.collections.Predicate)