主要的集合特质
Scala中所有的集合都扩展了Iterable特质。集合又可以分为三类:有先后次序的序列Seq;值的集合Set;键值对构成的对偶的映射Map。三类集合下分别还实现了特殊访问方式的特质:可以由下标来进行随机访问的IndexedSeq;可按照顺序访问的SortedSet;可按顺序访问的SortedMap。
迭代器
在迭代器之前,已经介绍了集合的不少使用方法,多是带有函数式特征的。而且在Scala中,也更加鼓励使用这些方法来进行操作。在面向对象编程中,迭代器是更加常见的,用来操作集合的方法。
对于完整构造需要很大开销的集合来说,使用迭代器是个不错的想法。比如在用Source.fromFile读取文件的时候。使用迭代器时,只有在需要的时候才去取元素,所以不会一次性将文件全部读取到内存。而使用迭代器时,需要注意的当然是迭代器是否有效,以及迭代器的指向位置。
流(A3)
流,stream,是一个尾部被懒计算的不可变列表。流会缓存下中间计算过的值,所以可以重新访问已经访问过的值,这点是与迭代器不同的。
懒视图
其他的集合也可以得到懒(lazy)计算相似的效果。使用集合的view方法。懒视图不会存储已经计算过的值。
懒视图可以用来避免构建大型中间集合,适合于处理需要多种方式进行变换的大型集合。
( 0 to 1000 ) . view . map ( pow ( 10 , _ ) ) . map ( 1 / _ ) . force
在上面的代码中,就避免了从pow方法中构建的中间集合map。
线程安全的集合
可变集合可以混入特质来使集合的操作变为同步的。这样的特质共有六个,都以Synchronized开头,详细的我就不列了。
需要注意的是,混入特质后,只是将操作变为同步的,并不能保证集合是线程安全的。(比如,并发进行修改和遍历集合。)
通常可以使用java.util.concurrent包中的类来保证线程安全,而且可以将这些集合也转换成Scala集合来使用(使用JavaConversions)。
并行集合
在Scala中可以方便地得到一个集合的并行实现。
coll . par . sum
上面的代码中coll是一个大型集合,而par方法会得到集合的并行实现——会尽可能地并行地执行结合方法。将上面的求和来说明,集合会被分成多个区块,然后由多个线程来对这些区块来进行求和,最后将区块的结果汇总得到最终的和。
par方法返回的是ParIterable的子类型,但ParIterable并不是Iterable的子类型。可以使用ser方法将并行集合转换回串行集合。
http://nerd-is.in/2013-09/scala-learning-collections/
本章的内容虽然多,但基本都是些用久了没不会有问题的内容。不过集合用来增删的操作真是有点多啊。