SCALA 集合框架文档翻译-Mutable and Immutable Collections

来源:互联网 发布:跟兄弟连学php 视频 编辑:程序博客网 时间:2024/06/05 05:08

可变集合与不可变集合


 英文原文:http://docs.scala-lang.org/overviews/collections/overview.html

        scala 集合对可变集合与不可变集合进行了系统的区分。一个可变集合本身可以被更新或者扩展。这意味着你能够以副作用的方式修改、添加、删除一个集合的元素。相反,不可变集合不可改变。不可变集合仍然有操作来模拟添加、删除以及更新操作,但是这些操作不会改变原有集合,而是返回一个新的集合。

        所有的集合类都定义在包 scala.collection 或者其子包 mutable、immutable、generic中。大多数用户需要的集合类都存在三种变体,分别存在于 scala.collection、scala.collection.immutable、scala.collection.mutable 包中。每种变体依据集合可变性质有不同的特征。

        包 scala.collection.immutable 中的集合类都是不可变的。这种集合一旦创建便再也无法改变。因此,你可以确信这个事实:在不同的时间点访问相同集合值将总是返回一个含有同样元素的集合。

        包 scala.collection.mutable 中的集合类含有一些可以修改本身集合的操作。因此,处理可变集合意味着你必须明白哪些代码何时修改了哪些集合。

        包 scala.collection 中的集合类可以使可变的,也可以使不可变的。例如:collection.IndexedSeq[T] 是 collection.immutable.IndexedSeq[T] 和 collection.mutable.IndexedSeq[T]的超类。一般来说,包 scala.collection 中的根集合类定义了与不可变集合中相同的接口,并且包 scala.collection.mutable 中的可变集合类通过会对这些不可变接口添加一些副作用操作。

        根集合类与不可变集合类的区别在于不可变集合类确保了没有人可以修改该集合,而根集合类只保证了它自己不会去修改该集合。虽然该集合的静态类型没有提供修改本身的操作,但是仍然可能它的运行时类型是一个可变集合,从而可以被用户修改。

        默认情况下,scala 总是选择不可变集合。例如,如果你单纯写一个 Set 而不带任何前缀,也不写任何导入语句,你回默认得到一个不可变集合;同样,如果你只写 Iterable,则得到一个不可变 iterable 集合,之所以会这样是因为已经从 scala 包中导入了默认绑定。如果你需要一个可变集合类的版本,需要显示的声明 collection.mutable.Set 或 collection.mutable.Iterable。

        一个有用的惯例约定:如果你需要同时使用mutable以及immutable版本的集合类,那么请导入包 collection.mutable。


import scala.collection.mutable

此时,一个无前缀的 Set 意味着一个不可变集合类,而 mutable.Set 指向一个对应的可变集合类。

        集合层级中最后一个包是 collection.generic。这个包含了实现集合的基本模块。典型地,集合类将他们的一些操作的实现推迟到包 generic 中的类。从另一方面来说,集合框架的使用者只有在特殊情况下才会需要引用 generic 中的类。

        为了便于使用以及向后兼容,一些重要的类型在包 scala 中定义了别名,因此你不需要显示导入这些类型而只用简单名字就行。List 类型就是一个很好的例子,你可以像下面这些方式访问它


scala.collection.immutable.List   //List定义的包路径scala.List                        //通过包 scala 中的别名List                              //由于包 scala 是默认导入的,所以可以直接使用

        其他类似的类型有: Traversable、Iterable、Seq、IndexedSeq、Iterator、Stream、Vector、StringBuilder 以及 Range。

下图给出了包 scala.collection 中的所有集合类。他们都是高层次的抽象类或Trait,通常会有可变以及不可变版本的实现。



下图给出了包 scala.collection.immutable 中的所有集合类。



下图给出了包 scala.collection.mutable 中的所有集合类。



(所有这些图都是Matthias at decodified.com生成的)



集合API概览


        最重要的集合类都已经在上述这些图中给出。这些集合类有一些共同点。例如:每种集合类的实例都可以用统一的语法来创建,集合类名后面跟集合元素:

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 集合类的实例调用 map 将产生一个 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)

这个原则在集合库中的体现无处不在,被称为统一返回类型原则。

        scala的集合层级中大多数集合类存在三种变体:root、mutable 和 immutable。唯一的例外是Buffer 这个 trait,它只有一个可变版本。

下面的章节中,我们会依次介绍这些集合类。
0 0