术语表

60 个核心概念,按章归类。

第1章 Scala 入门与环境

JVM Java Virtual Machine

Java 虚拟机,Scala 编译出的字节码在它上面运行。

字节码 Bytecode

JVM 执行的中间指令,跨平台但仍需要 JVM 解释或即时编译。

REPL Read-Eval-Print Loop

交互式命令行,读一行、编译执行一行并立即打印结果。

sbt Scala Build Tool

Scala 工程的标准构建工具,负责依赖、编译、测试和打包。

scala-cli Scala CLI

不建完整工程也能编译运行单文件 Scala 的命令行工具。

编译期 Compile Time

编译器检查类型并生成字节码的阶段,很多错误在这一步就暴露。

第2章 变量、类型与表达式

val Immutable Value

不可变绑定,初始化后不能再指向另一个对象。

var Mutable Variable

可重新赋值的变量,只在确实需要变化的地方使用。

类型推断 Type Inference

编译器根据右侧表达式自动确定类型,因此常可省略类型标注。

字符串插值 String Interpolation

在字符串里嵌入变量或表达式,常用 s""、f""、raw"" 三种前缀。

惰性求值 Lazy Evaluation

用 lazy val 延迟到第一次使用时才计算,并且只计算一次。

Unit Unit Type

表示没有有意义的返回值,唯一值是 (),常见于 println 这类带副作用的函数。

第3章 控制结构

模式匹配 Pattern Matching

按值的结构、类型或字面量分支处理,是 Scala 代替长串 if-else 的主力。

match 表达式 Match Expression

x match { case ... } 本身有返回值,可以直接赋给 val。

守卫 Guard

case 模式后面的 if 条件,模式匹配成功且条件为真才进入分支。

for 推导式 For Comprehension

用 for 和 yield 组合遍历、过滤、映射,底层展开成 map / flatMap / filter。

yield Yield

for 推导式里收集每次迭代结果的关键字,没有 yield 就只是遍历。

穷尽性检查 Exhaustiveness Check

编译器检查 match 是否覆盖所有分支;配合 sealed trait 才能可靠生效。

第4章 函数与高阶函数

高阶函数 Higher-Order Function

接收函数作为参数或返回函数的函数,map、filter、reduce 都属于这一类。

闭包 Closure

函数连同它捕获的外部变量一起形成的值,外部变量不会提前失效。

柯里化 Currying

把多参数函数改写成一层层单参数函数,便于部分应用和类型推断。

偏函数 Partial Function

只对部分输入有定义的函数,用 isDefinedAt 判断,catch 的 case 就是偏函数。

部分应用 Partial Application

只传部分参数、返回仍需要剩余参数的新函数,它不等于偏函数。

尾递归 Tail Recursion

递归调用位于函数最后一步,可用 @tailrec 让编译器优化成循环,避免栈溢出。

第5章 集合

不可变集合 Immutable Collection

每次修改都返回新集合,原集合不变,因此适合共享和并发。

List Linked List

不可变单链表,头插和模式匹配很快,按下标随机访问是线性时间。

Vector Vector

高效的不可变索引序列,随机访问接近 O(1),大量随机读写比 List 稳。

Map Map

键值对集合,默认不可变,查找与更新都返回新的 Map。

Set Set

不重复元素的集合,适合快速判断成员是否存在,默认同样不可变。

元组 Tuple

把固定数量、类型可不同的值打包在一起,用 _1、_2 或模式匹配取值。

第6章 类与对象

object Singleton Object

Scala 的单例对象,不需要 new,整个程序只有一个实例。

伴生对象 Companion Object

与 class 同名且同文件的对象,可访问私有成员,常放工厂方法和隐式实例。

apply Apply Method

名为 apply 的方法,调用时可省略方法名,List(1, 2) 和 Box(3) 都靠它。

trait Trait

可混入的抽象能力单元,能带字段和默认实现,比 Java 接口更灵活。

主构造器 Primary Constructor

写在类名后面的构造参数列表,类体中的语句就是初始化逻辑。

继承 Inheritance

子类复用并扩展父类,Scala 用 extends 单继承、用 with 混入多个 trait。

第7章 面向对象进阶

case class Case Class

自动生成 equals、hashCode、copy、apply/unapply 的数据类,最适合为业务数据建模。

sealed trait Sealed Trait

把子类限定在同一文件的 trait,让 match 能做穷尽检查,适合表达封闭集合。

代数数据类型 Algebraic Data Type

用“或”(多个子类型)和“与”(多个字段)组合出来的数据模型。

提取器 Extractor

实现 unapply 的对象,让值能在 match 中被拆开,case class 自动提供这一能力。

多态 Polymorphism

同一接口在不同类型上有不同实现,子类覆盖、重载和泛型都属于多态。

不可变数据模型 Immutable Data Model

用不可变 case class 组织业务数据,修改时 copy,便于测试与并发。

第8章 异常与 Option

Option Option

表示“可能有值也可能没有”的容器,只有 Some 和 None,用来替代 null。

Some 与 None Some / None

Some(x) 表示有值 x,None 表示没有值;对 None 调用 get 会抛异常。

Either Either

Left 与 Right 二选一,通常 Left 放错误、Right 放成功,并支持 for 推导式。

Try Try

把会抛异常的表达式包成 Success 或 Failure,适合在系统边界接住异常。

自定义异常 Custom Exception

继承 Exception 并携带业务字段的异常类型,让调用方能够精确捕获。

异常处理 Exception Handling

用 try/catch/finally 分离正常流程、错误恢复和资源清理,避免异常被静默吞掉。

第9章 泛型与隐式

类型参数 Type Parameter

写在方括号里的类型占位符,让类和方法不绑定具体类型,运行时会被擦除。

上下界 Upper / Lower Bound

A <: T 要求 A 是 T 的子类型,A >: T 要求 A 是 T 的父类型。

方差 Variance

用 +A 表示协变、-A 表示逆变,决定泛型容器能否安全替换成更宽或更窄的类型。

隐式参数 Implicit Parameter

编译器在调用处自动寻找并补上的参数,常用于注入 Ordering、ExecutionContext 等能力。

隐式转换与隐式类 Implicit Conversion / Implicit Class

隐式转换把一种类型看成另一种,隐式类借此给现有类型加方法,Scala 3 用 given/using 取代大部分隐式机制。

类型类 Type Class

用 trait 描述某种能力,再用隐式实例把能力与具体类型绑定,Ordering 就是典型例子。

第10章 实战:文件、JSON 与并发

Source 与 Using scala.io.Source / scala.util.Using

Source 按行读文本,Using 在代码块结束时自动关闭它,避免文件句柄泄漏。

java.nio Java NIO.2

Java 7 起的文件 API,Files 和 Path 让 UTF-8 文本的一次性读写更短更稳。

JSON JavaScript Object Notation

用对象、数组、字符串和数字表示数据的文本格式,解析后通常先转成 Scala 集合再统计。

Future Future

表示将来才会有的结果,任务在执行上下文线程池里运行,需要 Await 或组合子汇合。

Promise Promise

可手动完成的 Future 容器,成功时 success、失败时 failure,适合把回调式 API 包成 Future。

Await Await

阻塞等待 Future 完成并取出结果,只应在程序边界或测试中使用,别在并发任务里互相等待。