第十章 Scala 容器基础(七):用Vector做为你指定的不可变序列

问题:

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

相关文章
相关标签/搜索