В коллекциях Scala, если требуется итерация по коллекции (без возврата результатов, т.е. выполнения побочного эффекта для каждого элемента коллекции), это можно сделать либо с помощью
final def foreach(f: (A) ⇒ Unit): Unit
или
final def map[B](f: (A) ⇒ B): SomeCollectionClass[B]
За исключением возможного ленивого отображения (*), с точки зрения конечного пользователя, я вижу нулевые различия в этих вызовах:
myCollection.foreach { element =>
doStuffWithElement(element);
}
myCollection.map { element =>
doStuffWithElement(element);
}
учитывая, что я могу просто игнорировать, какие выходы карты. Я не могу придумать какой-либо конкретной причины, по которой должны существовать и использоваться два разных метода, когда map
, кажется, включает в себя все функции foreach
, и, на самом деле, меня впечатлило бы, если интеллектуальный компилятор и VM не будет оптимизировать создание этого объекта коллекции, учитывая, что он не назначен ни на что, ни читать, ни использовать в любом месте.
Итак, вопрос в том, правильно ли я - и нет причин называть foreach
где угодно в одном коде?
Примечания:
(*) Концепция ленивого отображения как показано на этом вопросе, может немного изменить ситуацию и оправдать использование foreach
, но насколько я может видеть, что нужно конкретно наткнуться на LazyMap
, normal
(**) Если вы не используете коллекцию, но пишете ее, то быстро натыкаетесь на то, что синтаксис синтаксиса синтаксиса for
на самом деле является синтаксическим сахаром, который генерирует вызов "foreach", то есть эти две строки генерировать полностью эквивалентный код:
for (element <- myCollection) { doStuffWithElement(element); }
myCollection.foreach { element => doStuffWithElement(element); }
Поэтому, если кто-то заботится о том, чтобы другие люди использовали этот класс коллекции с синтаксисом for
, все же можно было бы реализовать метод foreach
.