样例类
不可变数据载体
样例类 是 CoddyKit 上的免费 Scala for Backend Engineering & Functional Programming 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Scala for Backend Engineering & Functional Programming 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Scala for Backend Engineering & Functional Programming 课程共包含 4 节课。
什么是样例类?
样例类是一种专门用于保存不可变数据的特殊类。您可以使用 case class 声明它。
Scala 会自动为您生成许多实用代码,因此样例类成为建模数据的首选方式。
声明样例类
只需在参数列表中列出字段。每个参数都会成为一个不可变字段。
创建实例时不需要 new 关键字。
case class Point(x: Int, y: Int)
object Main {
def main(args: Array[String]): Unit = {
val p = Point(3, 4)
println(p.x)
println(p.y)
}
}自动生成 toString
样例类会自动获得可读的 toString,显示类名和字段值。
这让调试和日志记录变得非常轻松。
case class Point(x: Int, y: Int)
object Main {
def main(args: Array[String]): Unit = {
val p = Point(1, 2)
println(p)
}
}值相等性
样例类按值而不是按引用进行比较。字段相同的两个实例是相等的。
普通类则会按标识进行比较。
case class Point(x: Int, y: Int)
object Main {
def main(args: Array[String]): Unit = {
val a = Point(1, 2)
val b = Point(1, 2)
println(a == b)
}
}不可变字段
样例类的字段默认是 val,因此不能重新赋值。
如果需要修改后的版本,应创建一个新实例,而不是改变旧实例。
case class Point(x: Int, y: Int)
object Main {
def main(args: Array[String]): Unit = {
val p = Point(1, 2)
println(p.x)
}
}copy 方法
每个样例类都有一个 copy 方法。它会创建一个新实例,并允许您只修改指定的字段。
这是更新不可变数据的惯用方式。
case class Point(x: Int, y: Int)
object Main {
def main(args: Array[String]): Unit = {
val p = Point(1, 2)
val moved = p.copy(y = 99)
println(p)
println(moved)
}
}支持模式匹配
样例类与 match 配合得非常好。您可以在模式中写出字段名称来解构它们。
这是使用样例类的主要原因之一。
case class Point(x: Int, y: Int)
object Main {
def describe(p: Point): String = p match {
case Point(0, 0) => "origin"
case Point(x, 0) => s"on x-axis at $x"
case Point(x, y) => s"point ($x, $y)"
}
def main(args: Array[String]): Unit = {
println(describe(Point(0, 0)))
println(describe(Point(5, 0)))
println(describe(Point(2, 3)))
}
}参数默认值
与普通类一样,样例类的参数也可以设置默认值,因此构造时可以省略这些参数。
case class User(name: String, active: Boolean = true)
object Main {
def main(args: Array[String]): Unit = {
val u1 = User("Ada")
val u2 = User("Bo", false)
println(u1)
println(u2)
}
}添加方法
样例类可以像其他类一样,在类体中定义自己的方法。这些方法可以操作不可变字段。
case class Rect(w: Int, h: Int) {
def area: Int = w * h
}
object Main {
def main(args: Array[String]): Unit = {
val r = Rect(3, 4)
println(r.area)
}
}为什么使用样例类?
样例类可以免费提供:
- 包含不可变字段的简洁构造器
- 可读的
toString - 基于值的
equals和hashCode copy方法- 一流的模式匹配支持
它们是 Scala 中数据建模的基础。
综合运用
这个示例会创建、复制和比较一个样例类,并对其进行模式匹配。
case class Money(amount: Int, currency: String)
object Main {
def main(args: Array[String]): Unit = {
val price = Money(10, "USD")
val sale = price.copy(amount = 8)
println(price == sale)
sale match {
case Money(a, "USD") => println(s"$a dollars")
case Money(a, c) => println(s"$a $c")
}
}
}快速检查
测试您对样例类的理解。
回顾
您已经了解到,case class 可以表示带有自动生成辅助功能的不可变数据:
- 无需使用
new即可构造;字段是不可变的val - 免费获得
toString,以及基于值的equals/hashCode copy可创建修改后的副本- 内置模式匹配支持
- 支持默认值和自定义方法
常见问题解答
「样例类」课时是免费的吗?
是的 — 「样例类」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Scala for Backend Engineering & Functional Programming 课程的其余内容,请升级到 CoddyKit PRO。 Scala for Backend Engineering & Functional Programming 课程共包含 4 节课。
「样例类」这节课中我会学到什么?
不可变数据载体 你通过在浏览器中直接运行的动手代码来练习 Scala for Backend Engineering & Functional Programming,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Scala for Backend Engineering & Functional Programming 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Scala for Backend Engineering & Functional Programming 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「样例类」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Scala for Backend Engineering & Functional Programming 课中编写并运行代码吗?
能。每节 Scala for Backend Engineering & Functional Programming 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。