web-dev-qa-db-ja.com

Scala

可変コレクションがどのように機能するかを理解していない可能性があると思います。ただし、マップを適用したり、新しい要素を追加したりすると、可変コレクションが影響を受けると思います。

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)

この動作は不変のコレクションとは別ではないようですが、いつ別々に動作するのでしょうか。

20
Henry Henrinson

不変コレクションと可変コレクションの両方について、:++:は新しいコレクションを作成します。自動的に大きくなる可変コレクションが必要な場合は、 += で定義されている+=:メソッドとcollection.mutable.Bufferメソッドを使用します。

同様に、mapは新しいコレクションを返します— transformを探して、コレクションを所定の場所に変更します。

40

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)
6
missingfaktor

mapメソッドは、それを呼び出すコレクションを変更することはありません。型システムは、そのようなインプレースマップ実装の存在を許可しません-型シグネチャを変更しない限り、一部の型Collection[A]では、型A => Aの関数を使用してのみマップできます。

(編集:他の回答が指摘しているように、transformと呼ばれるそのようなメソッドがあります!)

mapは新しいコレクションを作成するため、関数Collection[A]を使用してCollection[B]からA => Bに移動できます。これははるかに便利です。

1
Ben James