Отличающийся.
foreach выполняет итерации по списку и применяет некоторую операцию с побочными эффектами каждому участнику списка (такими как сохранение каждого к базе данных, например)
, карта выполняет итерации по списку, преобразовывает каждого члена того списка и возвращает другой список того же размера с преобразованными участниками (такими как преобразование списка строк к верхнему регистру)
Важное различие между ними - то, что map
накапливает все результаты в набор, тогда как foreach
возвраты ничто. map
обычно используется, когда Вы хотите преобразовать набор элементов с функцией, тогда как foreach
просто выполняет действие для каждого элемента.
самое 'видимое' различие - то, что карта накапливает результат в новом наборе, в то время как foreach сделан только для самого выполнения.
, но существует несколько дополнительных предположений: так как 'целью' карты является новый список значений, это не делает действительно вопросов порядок выполнения. на самом деле некоторые среды выполнения генерируют параллельный код, или даже представляют некоторый memoizing, чтобы не призывать к повторным значениям или ленивости, стараться не называть некоторых вообще.
foreach, с другой стороны, называют специально для побочных эффектов; поэтому порядок важен, и обычно не может параллелизироваться.
Если Вы говорите о JavaScript, в частности, различие - то, что map
функция цикла, в то время как forEach
итератор.
Использование map
, когда Вы хотите применить операцию к каждому члену списка и вернуть результаты как новый список, не влияя на исходный список.
Использование forEach
, когда Вы хотите к , делает что-то на основе каждого элемента списка. Вы могли бы добавлять вещи к странице, например. По существу замечательно для того, когда Вы хотите "побочные эффекты".
Другие различия: forEach
возвраты ничто (так как это - действительно функция потока управления), и переданный - в функции не получает ссылки на индекс и целый список, тогда как карта возвращает новый список и только передает в элементе тока.
Короче говоря, foreach
предназначен для применения операции к каждому элементу коллекции элементов, тогда как map
- для преобразования одной коллекции в другую.
Между foreach
и map
есть два существенных различия.
foreach
не имеет концептуальных ограничений на применяемую операцию, кроме, возможно, приема элемента в качестве аргумента. То есть операция может ничего не делать, может иметь побочный эффект, может возвращать значение или не возвращать его. Все, о чем заботится foreach
- это итерация по коллекции элементов и применение операции к каждому элементу.
map
, с другой стороны, имеет ограничение на операцию: он ожидает, что операция вернет элемент и, возможно, примет элемент в качестве аргумента. Операция map
итерирует коллекцию элементов, применяя операцию к каждому элементу и сохраняя результат каждого вызова операции в другую коллекцию. Другими словами, map
преобразует одну коллекцию в другую.
foreach
работает с одной коллекцией элементов. Это входная коллекция.
map
работает с двумя коллекциями элементов: входной и выходной.
Не стоит связывать эти два алгоритма: на самом деле, их можно рассматривать иерархически, где map
является специализацией foreach
. То есть, вы можете использовать foreach
и попросить операцию преобразовать свой аргумент и вставить его в другую коллекцию. Таким образом, алгоритм foreach
является абстракцией, обобщением алгоритма map
. Фактически, поскольку foreach
не имеет ограничений на свою работу, мы можем смело сказать, что foreach
- это простейший механизм циклов, и он может делать все, что может делать цикл. map
, как и другие более специализированные алгоритмы, существует для выразительности: если вы хотите отобразить (или преобразовать) одну коллекцию в другую, ваше намерение будет более ясным, если вы используете map
, чем если вы используете foreach
.
Мы можем расширить это обсуждение дальше и рассмотреть алгоритм copy
: цикл, который клонирует коллекцию. Этот алгоритм тоже является специализацией алгоритма foreach
. Можно определить операцию, которая, задав элемент, будет вставлять этот же элемент в другую коллекцию. Если вы используете foreach
с этой операцией, вы фактически выполняете алгоритм copy
, хотя и с меньшей ясностью, выразительностью или четкостью. Пойдем еще дальше: Мы можем сказать, что map
является специализацией copy
, который сам является специализацией foreach
. map
может изменить любой из элементов, над которыми он итерируется. Если map
не изменяет ни один из элементов, то он просто копирует элементы, и использование copy более четко выражает намерение.
Сам алгоритм foreach
может иметь или не иметь возвращаемое значение, в зависимости от языка. В C++, например, foreach
возвращает операцию, которую он первоначально получил. Идея заключается в том, что у операции может быть состояние, и вы можете захотеть вернуть эту операцию, чтобы проверить, как она менялась по элементам. map
тоже может возвращать или не возвращать значение. В C++ transform
(эквивалент для map
здесь) возвращает итератор до конца выходного контейнера (коллекции). В Ruby возвращаемое значение map
- это выходная последовательность (коллекция). Таким образом, возвращаемое значение алгоритмов - это деталь реализации; их эффект может быть, а может и не быть тем, что они возвращают.