你須要爲你的Scala應用選擇一個快速,通用的不可變序列集合類型,那麼該如何選擇呢?
數據結構
Vecotr類目前能夠被認爲是這麼一個通用的不可變數據結構。Vector是一個帶索引的不可變序列容器,若是你更傾向於使用一個鏈式不可變集合容器,那麼你能夠選擇List。
spa
建立和使用一個Vector,就像其它的不可變帶索引的序列容器同樣。你能夠建立和高效地經過索引來訪問集合中的元素。scala
scala> val v = Vector("a", "b", "c") v: scala.collection.immutable.Vector[String] = Vector(a, b, c) scala> v(1) res2: String = b
你不能改變一個Vector,可是你能夠給Vector添加一個元素,產生一個新的Vector而後用一個新的變量來指向這個Vectorcode
scala> val a = Vector(1, 2, 3) a: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3) scala> val b = a ++ Vector(4, 5) b: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3, 4, 5)
你能夠使用update方法替換Vector中的元素,生成一個新的Vector而後用一個新的變量來指向這個新的Vector索引
scala> val a = Vector(1, 2, 3) a: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3) scala> val b = a.updated(0, 4) b: scala.collection.immutable.Vector[Int] = Vector(4, 2, 3)
你一樣能夠使用容器通用方法來獲取你想要的元素,好比task,filterio
scala> val a = Vector(1, 2, 3) a: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3) scala> val b = a.take(2) b: scala.collection.immutable.Vector[Int] = Vector(1, 2) scala> val c = a.filter(_ >= 2) c: scala.collection.immutable.Vector[Int] = Vector(2, 3)
就像上一節說的同樣,你一樣能夠使用一個可變變量指向一個不可變容器,而後改變容器內容返回一個新的容器table
scala> val a = Vector(1, 2, 3) a: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3) scala> val b = a ++ Vector(4,5) b: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3, 4, 5)
Vector做爲一個集合類型,按地址隨機存取元素效率是比較低的。可是Vector訪問列表元素是高效的,能夠在常量時間誒完成。Vector在快速隨機訪問和快速隨機存取方面是比較均衡的,Vectors如今是immutable indexed sequences的默認實現。當你不知掉該選擇什麼時,Vector是你對好的選擇,由於它在Scala集合中是最靈活和高效的。class
若是你建立一個IndexedSeq的實例,Scala就會給你一個Vector:效率
scala> val x = IndexedSeq(1,2,3) x: IndexedSeq[Int] = Vector(1, 2, 3)
最後,許多可發人員更新換直接建立一個IndexedSeq在他們的代碼中,而不是使用Vector,由於這樣會讓他們的代碼更能適應將來Scala的變化。容器