Ми всі знаємо, що ви не можете зробити наступне через ConcurrentModificationException
:
for (Object i : l) {
if (condition(i)) {
l.remove(i);
}
}
Але це, мабуть, працює іноді, але не завжди. Ось певний код:
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);
}
Це, звичайно, призводить до:
Exception in thread "main" java.util.ConcurrentModificationException
Незважаючи на те, що кілька потоків цього не роблять. У всякому разі.
Що найкраще вирішити цю проблему? Як я можу видалити елемент із колекції в циклі, не кидаючи цей виняток?
Тут я також використовую довільне Collection
, не обов'язково таке ArrayList
, тому не можна покладатися на них get
.