本文共 2117 字,大约阅读时间需要 7 分钟。
scala的集合系统的区分了可变( mutable )和不可变(immutable )集合。一个mutable 集合能够更新甚至扩展空间,这意味着你能改变,增加,或者删除一个集合的元素。 一个immutable集合,刚好相反,不能改变。你仍然可以做一些类似的增加,删除,或者更新,但是实际上(书生:跟java的string一样)他返回了一个新的对象,这里面就是指返回了一个新的集合,而老的集合没有改变。
所有的集合类在scala.collection
包中,或者他的子包中,分为mutable,immutable以及generic 。 大部分集合都有三个同名的类(经验翻译,不同见解可以指正),每个同名类有不同的特征.
scala.collection.immutable包中元素不可变,可以保证你在任何时间访问他时元素值都是相同的
scala.collection.mutabl 包中的元素可变,所以你要知道他在何时何地变化了
有一些集合类不在上述两个包下,如 是 和 的父类。一般情况下会在collection包下定义接口,由mutable和immutable两个包实现。
跳过一段废话。
(书生:重点)
scala默认的集合包是不可变的 ,即cala.collection.immutable。 举例:
Set
如果没有导入,默认collection.immutable.Set
如果你想用一个可变的Set,你需要导入collection.mutable.Set,即:
1 | import collection.mutable.Set |
如果想两个都引用,又想简单写,有个办法:
1 | import scala.collection.mutable |
直接用Set则仍是默认不可变的,如果想Set是mutable的,写成mutable.Set
还有一个包 collection.generic。 该package包含了实现集合的构建块。典型的, generic里classes推迟实现一些函数。另一方面,集合framework的用户需要在一些特殊环境中用到generic中的类。
为了便利,以及向后兼容,一些重要的类型有别名,因此你能用它们的简称,而不需要import.如List
1 2 3 4 | 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 |
其他的类型别名有, , , , , , ,, and .
下图展示了最高等级的抽象类 abstract classes 或者接口 traits
下图展示 scala.collection.immutable
.
下图展示 scala.collection.mutable
.
一些例子,父类和实现类,参考上图:
1 2 3 4 5 6 7 8 | 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) |
1 2 | List( 1 , 2 , 3 ) HashMap( "x" -> 24 , "y" -> 25 , "z" -> 26 ) |
以上toString方法实现相同,并且写法与如上相同。
所有集合类都支持Traversable提供的API,但只有一些特殊类有意义。如Traversable
类中的 map 方法返回另一个Traversable
,但结果类型会在子类中被重写。例如,在List中调用map,会返回一个List结果,在Set中调用返回Set.
1 2 3 4 | scala> List( 1 , 2 , 3 ) map ( _ + 1 ) res 0 : List[Int] = List( 2 , 3 , 4 ) scala> Set( 1 , 2 , 3 ) map ( _ * 2 ) res 0 : Set[Int] = Set( 2 , 4 , 6 ) |
上述集合函数库中的实现方式被成为 uniform return type principle. -- 一致返回类型原则
集合的大部分存在(指名字相同的类分别存在)三个包中:root,mutable,immutable.只有Buffer trait,只存在mutable集合中