Чем отличается операция 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