Вопрос проверяет понимание принципов Stream API, функционального стиля и побочных эффектов.
Изменять исходную коллекцию при работе со Stream API не рекомендуется. Stream рассчитан на декларативный стиль и отсутствие побочных эффектов. Модификация коллекции может привести к ConcurrentModificationException или некорректному поведению. Особенно это опасно при параллельных стримах. Stream должен использоваться для преобразований, а не изменения источника данных.
Stream API предназначен для:
обработки данных
фильтрации
преобразования
агрегации
При этом stream:
не хранит данные
работает поверх источника
предполагает отсутствие побочных эффектов
Пример опасного кода:
list.stream().forEach(e -> {
if (e > 10) {
list.remove(e);
}
});
Возможные последствия:
ConcurrentModificationException
пропуск элементов
неопределённое поведение
Stream может:
переупорядочивать операции
выполнять их лениво
работать параллельно
Любое изменение источника нарушает эти гарантии.
Безопасные альтернативы:
использовать filter и собрать новый результат
применять removeIf вне stream
использовать иммутабельные коллекции
List<Integer> result = list.stream()
.filter(e -> e <= 10)
.toList();
Stream API предназначен для чтения и трансформации, а не для изменения исходных данных. Мутации внутри stream — антипаттерн.