Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Java: stream, api

Можно ли изменять исходную коллекцию при работе со Stream API?

Вопрос проверяет понимание принципов Stream API, функционального стиля и побочных эффектов.

Короткий ответ

Изменять исходную коллекцию при работе со Stream API не рекомендуется. Stream рассчитан на декларативный стиль и отсутствие побочных эффектов. Модификация коллекции может привести к ConcurrentModificationException или некорректному поведению. Особенно это опасно при параллельных стримах. Stream должен использоваться для преобразований, а не изменения источника данных.

Длинный ответ

Основная идея Stream API

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 — антипаттерн.

Уровень

  • Рейтинг:

    5

  • Сложность:

    6

Навыки

  • Java

    Java

Ключевые слова

#stream

#api

Подпишись на Java Developer в телеграм