【scala初學】可變集合和不可變集合

scala的集合系統的區分了可變( mutable  )和不可變(immutable )集合。一個mutable  集合能夠更新甚至擴展空間,這意味着你能改變,增加,或者刪除一個集合的元素。 一個immutable集合,剛好相反,不能改變。你仍然可以做一些類似的增加,刪除,或者更新,但是實際上(書生:跟java的string一樣)他返回了一個新的對象,這裏面就是指返回了一個新的集合,而老的集合沒有改變。


所有的集合類在scala.collection 包中,或者他的子包中,分爲mutable,immutable以及generic 。 大部分集合都有三個同名的類(經驗翻譯,不同見解可以指正),每個同名類有不同的特徵.


scala.collection.immutable包中元素不可變,可以保證你在任何時間訪問他時元素值都是相同的

scala.collection.mutabl 包中的元素可變,所以你要知道他在何時何地變化了

有一些集合類不在上述兩個包下,如collection.IndexedSeq[T]collection.immutable.IndexedSeq[T] 和collection.mutable.IndexedSeq[T] 的父類。一般情況下會在collection包下定義接口,由mutable和immutable兩個包實現。


跳過一段廢話。


(書生:重點)

scala默認的集合包是不可變的 ,即cala.collection.immutable。 舉例:

Set 如果沒有導入,默認collection.immutable.Set

如果你想用一個可變的Set,你需要導入collection.mutable.Set,即:

import collection.mutable.Set

如果想兩個都引用,又想簡單寫,有個辦法:

import scala.collection.mutable

直接用Set則仍是默認不可變的,如果想Set是mutable的,寫成mutable.Set


還有一個包  collection.generic。 該package包含了實現集合的構建塊。典型的, generic裏classes推遲實現一些函數。另一方面,集合framework的用戶需要在一些特殊環境中用到generic中的類。


爲了便利,以及向後兼容,一些重要的類型有別名,因此你能用它們的簡稱,而不需要import.如List

scala.collection.immutable.List   // that's where it is defined
scala.List                        // via the alias in the  scala package
List                              // because  scala._ 
                                  // is always automatically imported

其他的類型別名有TraversableIterableSeqIndexedSeqIteratorStreamVector,StringBuilder, and Range.


下圖展示了最高等級的抽象類 abstract classes 或者接口 traits


collections.png

下圖展示 scala.collection.immutable.

collections.immutable.png 

下圖展示 scala.collection.mutable.

collections.mutable.png

一些例子,父類和實現類,參考上圖:

Traversable(1, 2, 3)
Iterable("x", "y", "z")
Map("x" -> 24, "y" -> 25, "z" -> 26)
Set(Color.red, Color.green, Color.blue)
SortedSet("hello", "world")
Buffer(x, y, z)
IndexedSeq(1.0, 2.0)
LinearSeq(a, b, c)
List(1, 2, 3)
HashMap("x" -> 24, "y" -> 25, "z" -> 26)

以上toString方法實現相同,並且寫法與如上相同。


 所有集合類都支持Traversable提供的API,但只有一些特殊類有意義。如Traversable 類中的 map 方法返回另一個Traversable ,但結果類型會在子類中被重寫。例如,在List中調用map,會返回一個List結果,在Set中調用返回Set.

scala> List(1, 2, 3) map (_ + 1) 
res0: List[Int] = List(2, 3, 4)
scala> Set(1, 2, 3) map (_ * 2)
res0: Set[Int] = Set(2, 4, 6)

上述集合函數庫中的實現方式被成爲 uniform return type principle. -- 一致返回類型原則


集合的大部分存在(指名字相同的類分別存在)三個包中:root,mutable,immutable.只有Buffer trait,只存在mutable集合中



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章