集合框架是 Scala 2.13 标准库的核心,也用于 Scala 3.x。它为集合类型提供了一个通用、统一且包罗万象的框架。此框架使你能够在高层级处理内存中的数据,程序的基本构建块是整个集合,而不是单个元素。
这种编程风格需要一些学习。幸运的是,Scala 集合的几个特性有助于适应。它们易于使用、简洁、安全、快速、通用。
易于使用:20-50 个方法的小型词汇表足以在几个操作中解决大多数集合问题。无需理解复杂的循环结构或递归。持久集合和无副作用操作意味着您不必担心意外地用新数据损坏现有集合。消除了迭代器和集合更新之间的干扰。
简洁:您可以用一个单词实现过去需要一个或多个循环才能实现的功能。您可以使用轻量级语法表达函数操作并轻松地组合操作,从而使结果感觉像自定义代数。
安全:必须体验一下才能理解。Scala 集合的静态类型和函数式特性意味着您可能犯下的绝大多数错误都会在编译时捕获。原因是:(1) 集合操作本身被大量使用,因此经过充分测试。(2) 集合操作的使用将输入和输出明确表示为函数参数和结果。(3) 这些显式输入和输出受静态类型检查约束。最重要的是,绝大多数误用都会表现为类型错误。完全有可能让包含数百行代码的程序在第一次尝试时就运行。
快速:集合操作在库中经过调整和优化。因此,使用集合通常非常高效。您可以使用经过精心调整的数据结构和操作做得更好,但您也可能会在沿途做出一些次优的实现决策而做得更糟。
并行:scala-parallel-collections
模块提供跨多个内核并行执行集合操作。并行集合通常支持与顺序集合相同的操作。您可以通过简单地调用 par
方法将顺序集合转换为并行集合。
通用:集合在任何有意义的类型上提供相同的操作。因此,您可以使用相当小的操作词汇来实现很多功能。例如,字符串在概念上是一系列字符。因此,在 Scala 集合中,字符串支持所有序列操作。数组也是如此。
示例:下面一行代码演示了 Scala 集合的许多优势。
val (minors, adults) = people partition (_.age < 18)
此操作的作用一目了然:它根据年龄将 people
集合划分为 minors
和 adults
。由于 partition
方法在根集合类型 IterableOps
中定义,因此此代码适用于任何类型的集合,包括数组。生成的 minors
和 adults
集合将与 people
集合类型相同。
此代码比传统集合处理所需的一到三个循环简洁得多(数组需要三个循环,因为中间结果需要缓冲到其他位置)。一旦了解了基本的集合词汇,您还会发现编写此代码比编写显式循环容易得多,也更安全。
此外,partition
操作非常快,在多核上的并行集合中甚至可以更快。
本文档从用户的角度深入讨论了 Scala 集合类的 API。它将带您了解所有基本类及其定义的方法。