Другие упоминали правильную точку зрения, что обычно это не то, как вы remove
объект из коллекции. ОДНАКО, в этом случае это нормально, так как вы break
вне цикла, как только вы remove
.
Если вы хотите продолжать итерацию после remove
, вам нужно использовать итератор. В противном случае вы получите ConcurrentModificationException
или, в более общем случае, неопределенное поведение.
Так что да, , если вы break
из foreach
после вас remove
, у вас все будет в порядке .
Для тех, кто говорит, что это не удастся, потому что вы не можете изменить коллекцию в foreach
- это верно, только если вы хотите продолжать итерацию. Это не тот случай, поэтому этот ярлык в порядке.
A ConcurrentModificationException
проверяется и генерируется итератором. Здесь, после remove
(который считается одновременной модификацией), вы break
вышли из цикла. Итератор даже не имеет возможности его обнаружить.
Лучше всего, если вы добавите комментарий к break
, почему это абсолютно необходимо и т. Д., Потому что , если этот код будет позже изменен для продолжения итерации после remove
, произойдет сбой .
Я бы отнесся к этой идиоме так же, как goto
(точнее, с пометкой break
/ continue
): поначалу она может показаться неправильной, но при разумном использовании она делает код чище.