Martin Odersky 和 Lex Spoon
在许多人看来,新的集合框架是Scala 2.8中最显著的改进。此前Scala也有集合(实际上新框架大部分地兼容了旧框架),但2.8中的集合类在通用性、一致性和功能的丰富性上更胜一筹。
即使粗看上去集合新增的内容比较微妙,但这些改动却足以对开发者的编程风格造成深远的影响。实际上,就好像你从事一个高层次的程序,而此程序的基本的构建块的元素被整个集合代替。适应这种新的编程风格需要一个过程。幸运的是,新的Scala集合得益于几个新的几个漂亮的属性,从而它们易于使用、简洁、安全、快速、通用。
易用性:由20-50个方法的小词汇量,足以在几个操作内解决大部分的集合问题。没有必要被复杂的循环或递归所困扰。持久化的集合类和无副作用的操作意味着你不必担心新数据会意外的破坏已经存在的集合。迭代器和集合更新之间的干扰会被消除!
简洁:你可以通过单独的一个词来执行一个或多个循环。你也可以用轻量级的语法和组合轻松地快速表达功能性的操作,以致结果看起来像一个自定义的代数。
安全:这一问题必须被熟练的理解,Scala集合的静态类型和函数性质意味着你在编译的时候就可以捕获绝大多数错误。原因是(1)、集合操作本身被大量的使用,是测试良好的。(2)、集合的用法要求输入和输出要显式作为函数参数和结果。(3)这些显式的输入输出会受到静态类型检查。最终,绝大部分的误用将会显示为类型错误。这是很少见的的有数百行的程序的首次运行。
快速:集合操作已经在类库里是调整和优化过。因此,使用集合通常是比较高效的。你也许能够通过手动调整数据结构和操作来做的好一点,但是你也可能会由于一些次优的实现而做的更糟。不仅如此,集合类最近已经能支持在多核处理器上并行运算。并行集合类支持有序集合的相同操作,因此没有新的操作需要学习也没有代码需要重写。你可以简单地通过调用标准方法来把有序集合优化为一个并行集合。
通用:集合类提供了相同的操作在一些类型上,确实如此。所以,你可以用相当少的词汇完成大量的工作。例如,一个字符串从概念上讲就是一个字符序列。因此,在Scala集合类中,字符串支持所有的序列操作。同样的,数组也是支持的。
例子:这有一行代码演示了Scala集合类的先进性。
val (minors, adults) = people partition (_.age < 18)
这个操作是清晰的:通过他们的age(年龄)把这个集合people拆分到到miors(未成年人)和adults(成年人)中。由于这个拆分方法是被定义在根集合类型TraversableLike类中,这部分代码服务于任何类型的集合,包括数组。例子运行的结果就是miors和adults集合与people集合的类型相同。
这个代码比使用传统的类运行一到三个循环更加简明(三个循环处理一个数组,是由于中间结果需要有其它地方做缓存)。一旦你已经学习了基本的集合词汇,你将也发现写这种代码显式的循环更简单和更安全。而且,这个拆分操作是非常快速,并且在多核处理器上采用并行集合类达到更快的速度(并行集合类已经Scala 2.9的一部分发布)。
本文档从一个用户的角度出发,提供了一个关于Scala集合类的 API的深入讨论。它将带你体验它定义的所有的基础类和方法。