Что возвращает метод map() при вызове у стрима, созданного из ArrayList?

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

Ответ

Метод map() возвращает новый объект Stream<R> (поток преобразованных элементов). Это промежуточная (lazy) операция, которая не изменяет исходную коллекцию (ArrayList).

Логика работы:

  1. Исходный список преобразуется в Stream<E>.
  2. map(Function<E, R> mapper) применяет функцию к каждому элементу и возвращает Stream<R> с результатами.
  3. Для материализации потока в новую коллекцию требуется терминальная операция (например, collect).

Пример:

List<String> originalList = Arrays.asList("java", "stream", "api");

// map() возвращает Stream<String>
Stream<String> upperCaseStream = originalList.stream()
        .map(String::toUpperCase); // Промежуточная операция, вычисления еще не было

// Терминальная операция collect() запускает обработку и создает новый List
List<String> newList = upperCaseStream.collect(Collectors.toList());

System.out.println(originalList); // [java, stream, api] (без изменений)
System.out.println(newList);      // [JAVA, STREAM, API]

Ключевой вывод: map() работает с потоком, а не с коллекцией напрямую. Исходный ArrayList остается неизменным.