О для понимания
Понимание for
в scala является синтаксическим сахаром для вызовов flatMap
, filter
, map
и foreach
. Точно так же, как вызовы этих методов, тип целевой коллекции приводит к типу возвращаемой коллекции. То есть:
list map f //is a List
vector map f // is a Vector
Это свойство является одной из базовых целей проектирования библиотеки коллекций scala и может рассматриваться как желательное в большинстве ситуаций.
Ответ на вопрос
Вам не нужно создавать какие-либо промежуточные коллекции, конечно:
(list.view map (_.prop)).toSet //uses list.view
(list.iterator map (_.prop)).toSet //uses iterator
(for { l <- list.view} yield l.prop).toSet //uses view
(Set.empty[Prop] /: coll) { _ + _.prop } //uses foldLeft
Все будут давать наборы без создания ненужных коллекций. Мое личное предпочтение - первое. С точки зрения идиоматического манипулирования коллекцией scala каждая «коллекция» поставляется с этими методами:
//Conversions
toSeq
toSet
toArray
toList
toIndexedSeq
iterator
toStream
//Strings
mkString
//accumulation
sum
Последний используется, когда тип элемента коллекции имеет неявный экземпляр Numeric
в области видимости; такие как:
Set(1, 2, 3, 4).sum //10
Set('a, 'b).sum //does not compile
Обратите внимание, что пример конкатенации строк в Scala выглядит следующим образом:
list.mkString(",")
А в библиотеке scalaz FP может выглядеть что-то вроде (которая использует Monoid
для суммирования строк):
list.intercalate(",").asMA.sum
Ваши предложения не похожи на Scala; Я не уверен, вдохновлены ли они другим языком.