Scala集合类系统地区分了可变的和不可变的集合。顾名思义,可变集合意味着可以对集合进行增加、删除、修改等扩展性的操作,对应的不可变集合,则不会改变。对这些不可变集合的增加、删除、修改等操作,都会返回一个新的集合,不会直接修改原有的集合。
所有的集合类都可以在scala.collection或scala.collection.mutable,scala.collection.immu⁃table,scala.collection.generic包中找到。对应的包结构如图5-1所示。
图5-1 集合类的包结构
其中,主要包的内容如下:
1)scala.collection.immutable包中的集合类:确保集合本身不能被修改。
2)scala.collection.mutable包中的集合类:支持对集合本身的增加、删除、修改等操作。
3)scala.collection包中的集合类,既可以是可变的,也可以是不可变的。scala.collection包中的根集合类中定义了相同的接口作为不可变集合类。同时,scala.collection.mutable包中的可变集合类代表性地添加了一些有辅助作用的修改操作到这个immutable接口。
如图5-2~图5-4所示是Scala官网的集合类图,给出了集合类的整个架构的类结构。其中,在图5-2中显示了scala.collection包中所有集合类。这些都是高级的抽象类或特质,通常包含可变和不可变的具体实现类。
图5-2 scala.collection包集合类的类图
其中,Traversable是所有集合的父类(特质,后续为了简化,不再具体指出是特质),对应该类对外提供的(即带有public访问修饰符)的方法,也继承到了具体子类中。Iter⁃able继承了Traversable,表示集合具有可迭代性,其他集合均继承了Iterable。具体子类Seq表示序列,Set为集合,Map表示映射,这几个集合类在后续会详细给出描述及其具体使用的实例与实例解析。
如图5-3中显示了scala.collection.immutable包中集合的类图。
图5-3 scala.collection.immutable包中集合类的类图
如图5-4中显示了scala.collection.mutable包中集合的类图。
(www.daowen.com)
图5-4 scala.collection.mutable包中的集合类的类图
a)可变Set类图 b)可变Map类图 c)可变Seq类图
图5-4中给出了更具体的实现子类,从上面3个类图中可以看到,所有的集合类都继承自Traversable,在该类中对应提供了一组接口及对应的默认实现。
同时,Scala集合类还提供了Traversable的伴生对象,在Traversable伴生对象中继承了TraversableFactory,对应集合类的构建工厂。
Scala的集合类库可以作为程序的基础组成构件,而对于可变集合与不可变集合的选择,应该根据是否需要对集合进行修改来确定。对应函数式编程范式而言,应尽可能选择不可变的集合类。当需要同时使用可变和不可变的集合类时,可以使用以下方式导入,然后使用mutable.xxx引用具体的可变集合类,使用xxx引入具体的不可变集合类,比如以Map集合类为例,可以通过如下方式导入并使用集合类:
为了方便使用,同时保证向后的兼容性,Scala类库还提供了一些类型和对象的别名,以便于使用集合类,对应的代码在Scala包对象中提供,具体代码如下所示:
以List为例(其他别名或重定义类似),在各定义上按F4键查看具体定义,此时可以看到:
1)type List[+A]=scala.collection.immutable.List[A]:定义了immutable包中的List[+A]类型的别名,List[+A]类型的定义如下所示:
2)val List=scala.collection.immutable.List:重定义了immutable包中的object List单例对象,object List单例对象的定义如下所示:
3)val Nil=scala.collection.immutable.Nil:重定义了immutable包中的case object Nil样例对象Nil,case object Nil样例对象Nil的定义如下所示:
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。