Scala 的集合库是一个强大的工具,支持一系列的数据结构,包括可变集合和不可变集合。Scala 的集合包括常见的集合类型,如列表(List)、数组(Array)、集合(Set)、映射(Map)等,且为这些集合提供了丰富的操作方法,使得数据处理更加高效和灵活。


📖 目录

  1. 集合概述
  2. 不可变集合与可变集合
  3. 常见集合类型
  4. 集合操作方法
  5. 集合与函数式编程
  6. 集合常见操作示例
  7. 参考资料

1. 集合概述

Scala 中的集合主要分为两类:不可变集合和可变集合。

  • 不可变集合:一旦创建,集合中的元素就不能更改(包括添加、删除、更新元素)。不可变集合是 Scala 的默认集合类型。
  • 可变集合:可以在集合创建后修改其内容(例如,添加、删除或更新元素)。

不管是可变还是不可变,Scala 都为它们提供了类似的操作方法,区别在于不可变集合操作时会生成新的集合,而可变集合操作会直接修改原有集合。


2. 不可变集合与可变集合

不可变集合:

Scala 中的不可变集合位于 scala.collection.immutable 包中,包括 ListSetMap 等。它们是默认类型,操作时不会改变原集合的状态,而是返回一个新的集合。

val list = List(1, 2, 3)  // 创建一个不可变的 List
val updatedList = list :+ 4  // 创建一个新的 List,添加 4
println(updatedList)  // 输出:List(1, 2, 3, 4)

可变集合:

可变集合位于 scala.collection.mutable 包中,包括 ArrayBufferHashSetHashMap 等。操作时,可以直接修改集合的内容。

import scala.collection.mutable.ListBuffer

val listBuffer = ListBuffer(1, 2, 3)  // 创建一个可变的 ListBuffer
listBuffer += 4  // 向 ListBuffer 添加元素
println(listBuffer)  // 输出:ListBuffer(1, 2, 3, 4)


3. 常见集合类型

List(列表)

List 是一个线性集合,具有不可变特性,元素按顺序存储。List 是一个递归数据结构,头部是一个元素,尾部是一个列表。

val list = List(1, 2, 3, 4, 5)
println(list.head)  // 输出:1
println(list.tail)  // 输出:List(2, 3, 4, 5)

  • head: 返回列表的第一个元素。
  • tail: 返回列表去掉第一个元素后的部分。

Set(集合)

Set 是一个无序的集合,不允许包含重复元素。Scala 提供了不可变和可变版本的 Set

val set = Set(1, 2, 3, 4, 5)
println(set.contains(3))  // 输出:true

  • contains: 检查集合中是否包含指定的元素。

Map(映射)

Map 是由键值对组成的集合,允许存储键值对的映射关系。Scala 提供了不可变和可变版本的 Map

val map = Map("a" -> 1, "b" -> 2, "c" -> 3)
println(map("b"))  // 输出:2

  • apply: 通过键访问对应的值。

Array(数组)

Array 是一种固定大小的可变集合,它是 Java 数组的包装类。

val arr = Array(1, 2, 3, 4, 5)
println(arr(2))  // 输出:3

  • 数组的大小在创建时已确定,且可以通过索引访问和修改数组元素。

4. 集合操作方法

Scala 提供了许多用于操作集合的内置方法,包括常见的集合操作、过滤、映射、折叠等。

常见操作:

  • map: 对集合中的每个元素应用一个函数,并返回一个新的集合。
  • filter: 过滤出符合条件的元素。
  • reduce / fold: 对集合中的元素进行累积操作。
  • flatMap: 对集合中的每个元素进行“扁平化”操作。

示例:

val numbers = List(1, 2, 3, 4, 5)

// 使用 map 转换每个元素
val squaredNumbers = numbers.map(x => x * x)
println(squaredNumbers)  // 输出:List(1, 4, 9, 16, 25)

// 使用 filter 筛选偶数
val evenNumbers = numbers.filter(x => x % 2 == 0)
println(evenNumbers)  // 输出:List(2, 4)

// 使用 reduce 计算总和
val sum = numbers.reduce((x, y) => x + y)
println(sum)  // 输出:15


5. 集合与函数式编程

Scala 的集合库与函数式编程密切相关,支持高阶函数和惰性计算。

高阶函数:

你可以将函数作为参数传递给集合方法,从而实现更加灵活的集合操作。

val numbers = List(1, 2, 3, 4, 5)
val doubled = numbers.map(x => x * 2)
println(doubled)  // 输出:List(2, 4, 6, 8, 10)

惰性计算:

Scala 的 Stream 集合和其他集合类型提供了惰性计算,即只有在需要时才会计算集合的元素。

val stream = Stream.from(1)  // 创建一个从 1 开始的 Stream
println(stream.take(5).toList)  // 输出:[1, 2, 3, 4, 5]


6. 集合常见操作示例

转换集合类型

val list = List(1, 2, 3, 4, 5)
val set = list.toSet  // 将 List 转换为 Set
println(set)  // 输出:Set(1, 2, 3, 4, 5)

集合合并

val list1 = List(1, 2, 3)
val list2 = List(4, 5, 6)
val mergedList = list1 ++ list2  // 合并两个列表
println(mergedList)  // 输出:List(1, 2, 3, 4, 5, 6)

集合去重

val listWithDuplicates = List(1, 2, 3, 2, 1)
val uniqueList = listWithDuplicates.distinct  // 去重
println(uniqueList)  // 输出:List(1, 2, 3)

集合分组

val numbers = List(1, 2, 3, 4, 5, 6)
val grouped = numbers.groupBy(x => x % 2 == 0)  // 按照偶数和奇数分组
println(grouped)  // 输出:Map(false -> List(1, 3, 5), true -> List(2, 4, 6))


7. 参考资料


Scala 的集合库为你提供了多种高效和灵活的集合类型,以及许多强大的操作方法,能够让你在函数式编程中高效处理数据。理解和掌握 Scala 的集合,将大大提升你的编程能力和应用开发效率。