2011-08-02 37 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

對於這兩個可變和不可變的集合,:++:創建新的集合。如果您想要自動增長的可變集合,請使用collection.mutable.Buffer定義的+=+=:方法。

同樣,map會返回一個新的集合 - 查找transform以更改集合。

1

map方法永遠不會修改您稱之爲的集合。類型系統不允許這樣的就地映射實現存在 - 除非您更改了其類型簽名,因此對於某些類型的Collection[A],您只能使用A => A類型的函數進行映射。

(編輯:其他答案已經指出的那樣,有這樣叫transform的方法!)

因爲map創建一個新的集合,你可以從一個Collection[A]Collection[B]使用功能A => B,這是去更有用。

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) 
相關問題