Существует ли различие между foreach и картой?

213
задан hippietrail 9 March 2016 в 01:00
поделиться

5 ответов

Отличающийся.

foreach выполняет итерации по списку и применяет некоторую операцию с побочными эффектами каждому участнику списка (такими как сохранение каждого к базе данных, например)

, карта выполняет итерации по списку, преобразовывает каждого члена того списка и возвращает другой список того же размера с преобразованными участниками (такими как преобразование списка строк к верхнему регистру)

290
ответ дан madlep 23 November 2019 в 04:27
поделиться

Важное различие между ними - то, что map накапливает все результаты в набор, тогда как foreach возвраты ничто. map обычно используется, когда Вы хотите преобразовать набор элементов с функцией, тогда как foreach просто выполняет действие для каждого элемента.

122
ответ дан Henk 23 November 2019 в 04:27
поделиться

самое 'видимое' различие - то, что карта накапливает результат в новом наборе, в то время как foreach сделан только для самого выполнения.

, но существует несколько дополнительных предположений: так как 'целью' карты является новый список значений, это не делает действительно вопросов порядок выполнения. на самом деле некоторые среды выполнения генерируют параллельный код, или даже представляют некоторый memoizing, чтобы не призывать к повторным значениям или ленивости, стараться не называть некоторых вообще.

foreach, с другой стороны, называют специально для побочных эффектов; поэтому порядок важен, и обычно не может параллелизироваться.

11
ответ дан Javier 23 November 2019 в 04:27
поделиться

Если Вы говорите о JavaScript, в частности, различие - то, что map функция цикла, в то время как forEach итератор.

Использование map, когда Вы хотите применить операцию к каждому члену списка и вернуть результаты как новый список, не влияя на исходный список.

Использование forEach, когда Вы хотите к , делает что-то на основе каждого элемента списка. Вы могли бы добавлять вещи к странице, например. По существу замечательно для того, когда Вы хотите "побочные эффекты".

Другие различия: forEach возвраты ничто (так как это - действительно функция потока управления), и переданный - в функции не получает ссылки на индекс и целый список, тогда как карта возвращает новый список и только передает в элементе тока.

2
ответ дан treat your mods well 23 November 2019 в 04:27
поделиться

Короче говоря, foreach предназначен для применения операции к каждому элементу коллекции элементов, тогда как map - для преобразования одной коллекции в другую.

Между foreach и map есть два существенных различия.

  1. foreach не имеет концептуальных ограничений на применяемую операцию, кроме, возможно, приема элемента в качестве аргумента. То есть операция может ничего не делать, может иметь побочный эффект, может возвращать значение или не возвращать его. Все, о чем заботится foreach - это итерация по коллекции элементов и применение операции к каждому элементу.

    map, с другой стороны, имеет ограничение на операцию: он ожидает, что операция вернет элемент и, возможно, примет элемент в качестве аргумента. Операция map итерирует коллекцию элементов, применяя операцию к каждому элементу и сохраняя результат каждого вызова операции в другую коллекцию. Другими словами, map преобразует одну коллекцию в другую.

  2. 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 - это выходная последовательность (коллекция). Таким образом, возвращаемое значение алгоритмов - это деталь реализации; их эффект может быть, а может и не быть тем, что они возвращают.

40
ответ дан 23 November 2019 в 04:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: