集合(Scala 2.8 - 2.12)

简介

语言

马丁·奥德斯基和莱克斯·斯彭

在许多人看来,新的集合框架是 Scala 2.8 版本中最重大的变化。Scala 以前有集合(事实上,新框架在很大程度上与它们兼容)。但只有 2.8 提供了一个通用、统一且包罗万象的集合类型框架。

尽管集合的添加乍一看很微妙,但它们可能在你的编程风格中引发的变化可能是深远的。事实上,通常情况下,就好像你使用程序的基本构建块在更高层次上工作,这些基本构建块是整个集合,而不是它们的元素。这种新的编程风格需要一些适应。幸运的是,Scala 新集合的几个优点有助于适应。它们易于使用、简洁、安全、快速、通用。

易于使用:20-50 个方法的小词汇就足以在几个操作中解决大多数集合问题。无需费尽心思去理解复杂的循环结构或递归。持久集合和无副作用操作意味着你无需担心意外地使用新数据损坏现有集合。迭代器和集合更新之间的干扰被消除了。

简洁:你可以用一个单词实现过去需要一个或多个循环才能实现的功能。你可以使用轻量级语法表达函数操作,并毫不费力地组合操作,因此结果感觉就像自定义代数。

安全:必须体验过才能理解。Scala 集合的静态类型和函数特性意味着您可能犯下的绝大多数错误都会在编译时被捕获。原因是:(1) 集合操作本身被大量使用,因此经过充分测试。(2) 集合操作的使用将输入和输出明确表示为函数参数和结果。(3) 这些显式输入和输出受静态类型检查约束。最重要的是,绝大多数错误使用都会表现为类型错误。有几百行代码的程序第一次运行就成功的情况并不少见。

快速:集合操作在库中经过调整和优化。因此,使用集合通常非常高效。您可以使用经过精心调整的数据结构和操作做得更好,但您也可能在沿途做出一些次优的实现决策而做得更差。更重要的是,集合最近已适应多核上的并行执行。并行集合支持与顺序集合相同的操作,因此无需学习新操作,也无需重写代码。您可以通过调用 par 方法将顺序集合转换为并行集合。

通用:集合在任何有意义的类型上提供相同的操作。因此,您可以使用相当小的操作词汇量实现很多目标。例如,字符串在概念上是一系列字符。因此,在 Scala 集合中,字符串支持所有序列操作。数组也是如此。

示例:下面一行代码展示了 Scala 集合的许多优势。

val (minors, adults) = people partition (_.age < 18)

此操作的作用一目了然:它根据年龄将 people 集合划分为 minorsadults。由于 partition 方法在根集合类型 TraversableLike 中定义,因此此代码适用于任何类型的集合,包括数组。生成的 minorsadults 集合将与 people 集合的类型相同。

此代码比传统集合处理所需的一到三个循环简洁得多(数组需要三个循环,因为中间结果需要缓冲到其他位置)。一旦您学习了基本的集合词汇,您还会发现编写此代码比编写显式循环容易得多,也更安全。此外,partition 操作非常快,并且在多核上的并行集合上会变得更快。(并行集合已作为 Scala 2.9 的一部分发布。)

本文从用户的角度深入讨论了 Scala 集合类的 API。它将带您了解所有基本类及其定义的方法。

此页面的贡献者