Прежде всего, вы должны стремиться к правильности. Для большинства коллекций запрещено изменять исходную коллекцию при ее повторении. Вы можете получить ConcurrentModificationException
во время попытки, но даже если это произойдет без исключения, код все равно будет неправильным. Просто эта ошибка не всегда обнаруживается (это проверка с максимальным усилием, чтобы избежать потери производительности). Это относится к forEach(…)
, а также к stream().forEach(…)
и циклу for-each (for(variable declaration: collection)
)
Единственная поддержка для удаления элементов во время итерации - вручную Iterator
использование:
for(Iterator<Object> it = myFirstCollection.iterator(); it.hasNext(); ) {
Object o = it.next();
if(conditionReturningTrue(o)) {
it.remove();
mySecondCollection.add(o);
}
}
Альтернативой являются массовые методы.
Во-первых, как показано в this и , которые отвечают, создавая копию всех элементов, которые должны быть переданы первыми.
Во-вторых, вы можете использовать
myFirstCollection.removeIf(o -> conditionReturningTrue(o) && mySecondCollection.add(o));
В реализации default
removeIf
используется Iterator
в цикле, аналогичном приведенному выше. Однако такие коллекции, как ArrayList
, предоставляют собственную реализацию removeIf
, чтобы преодолеть квадратичную временную сложность цикла Iterator
.