Ответ
Метод map() в java.util.stream.Stream работает с функциональным интерфейсом java.util.function.Function<T, R>.
Детали интерфейса Function<T, R>:
- Абстрактный метод:
R apply(T t)— принимает аргумент типаTи возвращает результат типаR. - Назначение в
map(): Задать правило преобразования каждого элемента исходного потока (Stream<T>) в элемент нового потока (Stream<R>).
Почему это важно? Использование стандартного интерфейса Function обеспечивает совместимость с лямбда-выражениями и ссылками на методы, что делает код лаконичным.
Пример с лямбдой и ссылкой на метод:
List<String> names = List.of("John", "Alice", "Bob");
// Использование лямбда-выражения
List<String> upperNames1 = names.stream()
.map(name -> name.toUpperCase()) // Function<String, String>
.toList();
// Использование ссылки на метод (более идиоматично)
List<String> upperNames2 = names.stream()
.map(String::toUpperCase) // Тот же Function<String, String>
.toList();
Ключевые свойства map():
- Не модифицирует источник: Работает по принципу immutability.
- Ленивая операция: Вычисление происходит только при вызове терминальной операции (например,
collect()илиtoList()). - Сохраняет порядок: В последовательных потоках порядок элементов сохраняется.