如何在Scala中使用可变集合

时间:2011-08-02 09:17:50

标签: scala collections mutable

我想我可能无法理解可变集合的工作原理。我希望通过将map应用于它们或添加新元素来影响可变集合,但是:

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 个答案:

答案 0 :(得分:40)

对于不可变和可变集合,:++:创建新集合。如果您希望自动增长的可变集合,请使用collection.mutable.Buffer定义的+=+=:方法。

同样,map会返回一个新集合 - 查找transform来更改集合。

答案 1 :(得分:6)

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)

答案 2 :(得分:1)

map方法永远不会修改您调用它的集合。类型系统不允许存在这样的就地映射实现 - 除非您更改了其类型签名,因此在某些类型Collection[A]上,您只能使用类型A => A的函数进行映射。 / p>

(编辑:正如其他答案所指出的那样,有一种名为transform的方法!)

由于map创建了一个新集合,您可以使用函数Collection[A]Collection[B]转到A => B,这更有用。