你须要为你的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的变化。容器