Skip to content

5 Чем отличается метод map от flatMap в Stream API?

В Java Stream API методы map и flatMap используются для преобразования элементов в потоке, но они имеют разные цели и поведение. Давайте рассмотрим их отличия более подробно.

Метод map

  • Описание: Метод map применяется к каждому элементу потока и преобразует его в другой объект, возвращая новый поток, содержащий преобразованные элементы.
  • Возвращаемый тип: map принимает функцию, которая возвращает объект, и возвращает поток объектов того же типа, что и результат функции.
  • Пример использования: java List<String> names = Arrays.asList("Alice", "Bob", "Charlie"); List<Integer> nameLengths = names.stream() .map(String::length) // Преобразует каждую строку в ее длину .collect(Collectors.toList()); // nameLengths будет содержать [5, 3, 7]

Метод flatMap

  • Описание: Метод flatMap также применяется к каждому элементу потока, но он ожидает, что функция, переданная в качестве аргумента, вернет поток (или другую коллекцию) для каждого элемента. Затем flatMap "разворачивает" эти потоки в один поток, объединяя все элементы.
  • Возвращаемый тип: flatMap принимает функцию, которая возвращает поток, и возвращает поток, содержащий все элементы из всех потоков, возвращенных функцией.
  • Пример использования: ```java List> listOfLists = Arrays.asList( Arrays.asList("Alice", "Bob"), Arrays.asList("Charlie", "David") );

List allNames = listOfLists.stream() .flatMap(List::stream) // Разворачивает вложенные списки в один поток .collect(Collectors.toList()); // allNames будет содержать ["Alice", "Bob", "Charlie", "David"] ```

Основные отличия

  1. Тип возвращаемого значения:
  2. map возвращает поток, содержащий элементы, преобразованные в другой тип.
  3. flatMap возвращает поток, содержащий все элементы из потоков, возвращенных функцией.

  4. Использование:

  5. map используется, когда вы хотите преобразовать элементы в другой тип, не изменяя структуру (например, преобразование строк в их длины).
  6. flatMap используется, когда вы работаете с вложенными структурами данных (например, списками списков) и хотите "развернуть" их в один поток.

Заключение

Методы map и flatMap являются мощными инструментами в Java Stream API, позволяя эффективно обрабатывать и преобразовывать данные. Понимание их различий поможет вам выбрать правильный метод в зависимости от ваших потребностей в обработке данных.