Scala 的集合库是一个强大的工具,支持一系列的数据结构,包括可变集合和不可变集合。Scala 的集合包括常见的集合类型,如列表(List
)、数组(Array
)、集合(Set
)、映射(Map
)等,且为这些集合提供了丰富的操作方法,使得数据处理更加高效和灵活。
📖 目录
1. 集合概述
Scala 中的集合主要分为两类:不可变集合和可变集合。
- 不可变集合:一旦创建,集合中的元素就不能更改(包括添加、删除、更新元素)。不可变集合是 Scala 的默认集合类型。
- 可变集合:可以在集合创建后修改其内容(例如,添加、删除或更新元素)。
不管是可变还是不可变,Scala 都为它们提供了类似的操作方法,区别在于不可变集合操作时会生成新的集合,而可变集合操作会直接修改原有集合。
2. 不可变集合与可变集合
不可变集合:
Scala 中的不可变集合位于 scala.collection.immutable
包中,包括 List
、Set
、Map
等。它们是默认类型,操作时不会改变原集合的状态,而是返回一个新的集合。
val list = List(1, 2, 3) // 创建一个不可变的 List
val updatedList = list :+ 4 // 创建一个新的 List,添加 4
println(updatedList) // 输出:List(1, 2, 3, 4)
可变集合:
可变集合位于 scala.collection.mutable
包中,包括 ArrayBuffer
、HashSet
、HashMap
等。操作时,可以直接修改集合的内容。
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 的集合,将大大提升你的编程能力和应用开发效率。
发表回复