2011-08-02 6 views
19

私は可変コレクションがどのように機能するのか理解できないかもしれないと思います。しかし私は、変更可能なコレクションは、それらにマップを適用するか、新しい要素を追加することによって影響を受けることが期待される: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) 

この動作は不変コレクションとは別ではないようですので、それらを個別に動作しないとき?

+0

問題は、両方のメソッドが新しいコレクションをマップして返しますが、コレクションはその場所でコレクションを変更しないという点です。 –

答えて

39
不変と可変両方のコレクションのために

:++:新しいコレクションを作成します。変更可能なコレクションが自動的に成長するようにするには、で定義された+=および+=:メソッドを使用します。

同様に、mapは新しいコレクションを返します。コレクションを変更するにはtransformを探してください。

1

mapメソッドは、それを呼び出すコレクションを決して変更しません。タイプ・システムでは、タイプ・シグネチャを変更しない限り、そのようなインプレース・マップ・インプリメンテーションは存在しません。したがって、タイプCollection[A]では、タイプA => Aのファンクションを使用してのみマップできます。

(編集:他の回答が指摘したように、transformと呼ばれる、このような方法がある)mapは、新しいコレクションを作成するので、あなたはある機能A => Bを、使用してCollection[A]Collection[B]から行くことができます

はるかに便利です。

6

map操作は、コレクションのすべての要素に所定の関数を適用し、は新しいコレクションを生成します。

あなたが探している操作はtransformです。変換関数がa -> bではなくa -> aでなければならない点を除いて、それは内部で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) 
関連する問題