第四章·集合横切:不可变数据结构


第四章 · 集合横切:不可变数据结构

章节摘要:集合库是 Scala 日常使用率最高的部分,也是第三章函数式技巧的完整演练场。本章从集合类型层级讲起,遍历不可变集合族与可变集合,最后给出"选哪个"的决策依据。读完你能写出既正确又贴合数据规模的集合代码。

学习目标

  • 画出集合继承树的三大分支(Seq、Set、Map)与不可变/可变两套体系
  • 按访问模式选 List、Vector、ArrayBuffer 或 Map 变体
  • 熟练使用 map、flatMap、filter、fold、groupBy 等组合子
  • 避开集合视图、相等性、并发共享的常见坑

核心概念速览

金句:选集合先问两个问题——按什么方式访问、要不要可变;其余差异都是这两个问题的推论。

子章节导航

  • 4.1 集合框架与类型层级:一张继承树读懂设计,含各结构的复杂度对照。
  • 4.2 不可变集合族:List、Vector、Map、Set 的结构与适用。
  • 4.3 可变集合与集合操作选型:何时值得引入可变,组合子性能与选型决策。

子章节之间的逻辑关系

4.1 给地图,4.2 深入默认阵营(不可变),4.3 讲例外情形(可变)与组合子的性能选型——先立规矩再讲例外,顺序本身就是选型逻辑。

[层级地图] -> [不可变主力] -> [可变例外 + 组合子性能] | 第五章:给集合装上类型参数,登上主峰 ​

前置知识与后续延伸

前置:第三章 map/flatMap 与模式匹配。延伸:5.1 的型变就是从 List 的类型参数讲起的;6.3 会补并发集合。

本章实战主线:温度数据的批量分析

延续前两章的温度工具,本章让它们处理真实规模的数据——把一年的逐小时读数做成可分析的集合:

case class Row(day: Int, hour: Int, celsius: Double) val rows: List[Row] = loadYear() // 8760 行 val dailyAvg = rows.groupMapReduce(_.day)(_.celsius)( (a, b) => a + b) // 按天求和,再除以小时数得日均 val hot = rows.filter(_.celsius > 35).groupBy(_.day).keySet val top3 = rows.groupBy(_.day) .view.mapValues(rs => rs.map(_.celsius).sum / rs.size) .toList.sortBy(-_._2).take(3) // 最热三天 ​

这条管线用到了本章全部主角:group 前缀家族一次完成分组映射聚合、view 挂在 mapValues 上省一次复制、sortBy 负号做降序。换到 Vector 或再换到 Iterator 流式读取,操作代码几乎不动——这正是集合框架统一接口的兑现时刻。

集合选型速查

场景 首选 理由
头部增删频繁 List O(1) 结构共享
随机读写均衡 Vector 分块树近似 O(log n)
去重判断 Set 哈希成员检查 O(1)
键值映射 Map 同上
超大数据一遍过 Iterator / view 惰性,不落地中间结果
补充一条选型纪律:任何跨方法边界传递的集合,签名上优先写接口而非实现——用 Seq[Row] 而不是 List[Row],给调用方留实现的自由,也给未来替换实现留门。这一习惯到第八章定义库 API 时会再次被强调。
作者与出处
原作者:灏天文库
来源:平台策划编纂
整理人: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U