Как использовать изменяемые коллекции в Scala - PullRequest
20 голосов
/ 02 августа 2011

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

scala> val s: collection.mutable.Seq[Int] = collection.mutable.Seq(1)
s: scala.collection.mutable.Seq[Int] = ArrayBuffer(1)

scala> s :+ 2 //appended an element
res32: scala.collection.mutable.Seq[Int] = ArrayBuffer(1, 2)

scala> s //the original collection is unchanged
res33: scala.collection.mutable.Seq[Int] = ArrayBuffer(1)

scala> s.map(_.toString) //mapped a function to it
res34: scala.collection.mutable.Seq[java.lang.String] = ArrayBuffer(1)

scala> s //original is unchanged
res35: scala.collection.mutable.Seq[Int] = ArrayBuffer(1)

//maybe mapping a function that changes the type of the collection shouldn't work
//try Int => Int

scala> s.map(_ + 1)
res36: scala.collection.mutable.Seq[Int] = ArrayBuffer(2)

scala> s //original unchanged
res37: scala.collection.mutable.Seq[Int] = ArrayBuffer(1)

Такое поведение не кажется отдельным от неизменяемых коллекций, поэтому, когда они ведут себя отдельно?

Ответы [ 3 ]

40 голосов
/ 02 августа 2011

Для неизменных и изменяемых коллекций :+ и +: создают новые коллекции. Если вы хотите, чтобы изменяемые коллекции автоматически увеличивались, используйте методы += и +=:, определенные как collection.mutable.Buffer.

Аналогично, map возвращает новую коллекцию - ищите transform, чтобы изменить коллекцию на месте.

6 голосов
/ 02 августа 2011
Операция

map применяет данную функцию ко всем элементам коллекции, а создает новую коллекцию .

Требуемая операция называется transform.Вы можете думать об этом как о map, за исключением того, что функция преобразования должна иметь тип a -> a вместо a -> b.

scala> import collection.mutable.Buffer
import collection.mutable.Buffer

scala> Buffer(6, 3, 90)
res1: scala.collection.mutable.Buffer[Int] = ArrayBuffer(6, 3, 90)

scala> res1 transform { 2 * }
res2: res1.type = ArrayBuffer(12, 6, 180)

scala> res1
res3: scala.collection.mutable.Buffer[Int] = ArrayBuffer(12, 6, 180)
1 голос
/ 02 августа 2011

Метод map никогда не изменяет коллекцию, в которой вы его вызываете.Система типов не позволила бы существовать такой реализации карты на месте - если только вы не изменили ее сигнатуру типа, так что для некоторого типа Collection[A] вы можете отображать только с использованием функции типа A => A.

(Правка: как указывали другие ответы, существует такой метод, который называется transform!)

Поскольку map создает новую коллекцию, вы можете перейти от Collection[A] к Collection[B]используя функцию A => B, которая гораздо полезнее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...