Чем отличается операция map от flatMap

Операции `map` и `flatMap` являются важными концепциями в функциональном программировании и широко используются во многих языках программирования, в контексте работы с коллекциями и потоками данных (streams). Хотя обе операции применяют функцию к элементам потока или коллекции, между ними есть ключевые отличия в поведении и результате выполнения.

Операция map

Применяет заданную функцию к каждому элементу коллекции или потока и возвращает новую коллекцию или поток, состоящий из результатов применения этой функции. Важно отметить, что при ее использовании количество элементов во входной и выходной коллекции (или потоке) остается неизменным.

List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
List<Integer> squaredNumbers = numbers.stream()
                                       .map(n -> n * n)
                                       .collect(Collectors.toList());
// squaredNumbers будет содержать [1, 4, 9, 16]


Операция flatMap

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

List<List<Integer>> listOfLists = Arrays.asList(
    Arrays.asList(1, 2),
    Arrays.asList(3, 4, 5)
);
List<Integer> flatList = listOfLists.stream()
                                    .flatMap(Collection::stream)
                                    .collect(Collectors.toList());
// flatList будет содержать [1, 2, 3, 4, 5]

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

  • Результат: `map` преобразует каждый элемент коллекции отдельно и возвращает коллекцию того же размера. `flatMap` может преобразовывать каждый элемент в несколько элементов и "сплющивает" результат в одну коллекцию, что может изменить количество элементов в итоговой коллекции.
  • Использование: `map` используется для простых преобразований элементов, а `flatMap` — для преобразований, при которых каждый элемент может быть представлен несколькими элементами в результате.

Выбор между `map` и `flatMap` зависит от конкретной задачи и желаемой структуры выходных данных.

Feb. 27, 2024, easyoffer