Изменяются ли исходные данные при работе со Stream в Java?

«Изменяются ли исходные данные при работе со Stream в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет, исходные данные остаются неизменными. Stream в Java работает по принципу неизменяемого конвейера операций.

Ключевые моменты:

  • Stream не модифицирует источник данных (коллекцию, массив и т.д.).
  • Все промежуточные операции (map, filter, sorted) возвращают новый Stream.
  • Терминальная операция (collect, forEach) обрабатывает данные, но не изменяет исходную коллекцию.

Пример:

List<String> originalList = Arrays.asList("a", "b", "c");
List<String> result = originalList.stream()
        .map(String::toUpperCase)
        .collect(Collectors.toList());

System.out.println(originalList); // [a, b, c] - исходные данные не изменились
System.out.println(result);       // [A, B, C] - новый список

Исключение (плохая практика): Если в терминальной операции forEach явно модифицировать состояние элементов исходной коллекции, это может привести к изменению данных. Такой подход нарушает принципы функционального программирования и может вызвать проблемы с потокобезопасностью.