可変コレクションがどのように機能するかを理解していない可能性があると思います。ただし、マップを適用したり、新しい要素を追加したりすると、可変コレクションが影響を受けると思います。
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)
この動作は不変のコレクションとは別ではないようですが、いつ別々に動作するのでしょうか。
不変コレクションと可変コレクションの両方について、:+
と+:
は新しいコレクションを作成します。自動的に大きくなる可変コレクションが必要な場合は、 +=
で定義されている+=:
メソッドとcollection.mutable.Buffer
メソッドを使用します。
同様に、map
は新しいコレクションを返します— transform
を探して、コレクションを所定の場所に変更します。
map
操作は、指定された関数をコレクションのすべての要素に適用し、新しいコレクションを生成します。
探している操作はtransform
と呼ばれます。変換関数のタイプがa -> a
ではなくa -> b
である必要があることを除いて、インプレースmap
と考えることができます。
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)
map
メソッドは、それを呼び出すコレクションを変更することはありません。型システムは、そのようなインプレースマップ実装の存在を許可しません-型シグネチャを変更しない限り、一部の型Collection[A]
では、型A => A
の関数を使用してのみマップできます。
(編集:他の回答が指摘しているように、transform
と呼ばれるそのようなメソッドがあります!)
map
は新しいコレクションを作成するため、関数Collection[A]
を使用してCollection[B]
からA => B
に移動できます。これははるかに便利です。