Iterando através de uma Coleção, evitando ConcurrentModificationException ao remover objetos em um loop
Todos sabemos que você não pode fazer isso:
for (Object i : l) {
if (condition(i)) {
l.remove(i);
}
}
ConcurrentModificationException
etc ... isso aparentemente funciona às vezes, mas nem sempre. Aqui está um código específico:
public static void main(String[] args) {
Collection<Integer> l = new ArrayList<>();
for (int i = 0; i < 10; ++i) {
l.add(4);
l.add(5);
l.add(6);
}
for (int i : l) {
if (i == 5) {
l.remove(i);
}
}
System.out.println(l);
}
Obviamente, isso resulta em:
Exception in thread "main" java.util.ConcurrentModificationException
... mesmo que vários threads não estejam fazendo isso ... Enfim.
Qual é a melhor solução para esse problema? Como posso remover um item da coleção em um loop sem lançar essa exceção?
Eu também estou usando um arbitrárioCollection
aqui, não necessariamente umArrayList
, então você não pode confiarget
.