解构
从数据中提取内容
解构 是 CoddyKit 上的免费 Scala for Backend Engineering & Functional Programming 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Scala for Backend Engineering & Functional Programming 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Scala for Backend Engineering & Functional Programming 课程共包含 4 节课。
什么是解构?
解构(也称为拆解)是指直接在模式中提取数据结构的各个部分。
您无需调用访问器方法,而是描述数据的形状,并命名所需的部分。
解构元组
元组可以将多个值组合在一起。您可以在一次绑定中通过在括号内写出名称来拆分这些值。
object Main {
def main(args: Array[String]): Unit = {
val pair = ("Ada", 1815)
val (name, year) = pair
println(s"$name was born in $year")
}
}match 中的元组
您可以在 match 中解构元组,为每个组件命名或进行匹配。
object Main {
def quadrant(p: (Int, Int)): String = p match {
case (0, 0) => "origin"
case (x, 0) => s"on x-axis at $x"
case (0, y) => s"on y-axis at $y"
case (x, y) => s"point ($x, $y)"
}
def main(args: Array[String]): Unit = {
println(quadrant((0, 0)))
println(quadrant((3, 0)))
println(quadrant((2, 5)))
}
}解构列表头部
:: 运算符(cons)会将列表拆分为第一个元素(头部)和其余部分(尾部)。
模式 head :: tail 可以匹配任何非空列表。
object Main {
def first(xs: List[Int]): String = xs match {
case head :: tail => s"head=$head, rest=$tail"
case Nil => "empty"
}
def main(args: Array[String]): Unit = {
println(first(List(10, 20, 30)))
println(first(Nil))
}
}匹配精确的列表形状
您可以通过列出元素来匹配特定长度的列表,例如 List(a, b) 表示恰好包含两个元素。
object Main {
def shape(xs: List[Int]): String = xs match {
case List() => "none"
case List(a) => s"one: $a"
case List(a, b) => s"two: $a, $b"
case _ => "many"
}
def main(args: Array[String]): Unit = {
println(shape(List()))
println(shape(List(1)))
println(shape(List(1, 2)))
println(shape(List(1, 2, 3)))
}
}使用头部和尾部递归
将头部与尾部拆分后,就可以简洁地对列表进行递归。
这里我们将头部加上尾部的总和,从而计算列表的总和。
object Main {
def sum(xs: List[Int]): Int = xs match {
case Nil => 0
case head :: tail => head + sum(tail)
}
def main(args: Array[String]): Unit = {
println(sum(List(1, 2, 3, 4)))
}
}解构嵌套结构
模式可以嵌套。您可以一次性解构列表中的元组,或元组中的列表。
object Main {
def main(args: Array[String]): Unit = {
val data = List(("a", 1), ("b", 2))
data match {
case (key, value) :: _ => println(s"first key=$key value=$value")
case Nil => println("empty")
}
}
}使用 _ 忽略部分内容
对于不关心的组件,请使用 _。这样可以让模式专注于实际需要的数据。
object Main {
def main(args: Array[String]): Unit = {
val triple = (1, 2, 3)
val (_, middle, _) = triple
println(s"middle = $middle")
}
}绑定前两个元素,保留其余部分
您可以命名前几个元素,并使用尾部模式捕获后面的所有内容。
object Main {
def main(args: Array[String]): Unit = {
val xs = List(1, 2, 3, 4, 5)
xs match {
case a :: b :: rest => println(s"a=$a b=$b rest=$rest")
case _ => println("too short")
}
}
}为什么使用解构?
解构让数据访问变得:
- 声明式:描述数据形状,而不是描述操作步骤
- 安全:提取数据时会检查结构
- 简洁:在一个模式中绑定多个值
结合样例类后,它的功能会更加强大。
综合运用
这个示例会解构一个元组列表,并根据其形状作出响应。
object Main {
def report(scores: List[(String, Int)]): String = scores match {
case Nil => "no scores"
case (name, pts) :: Nil => s"only $name with $pts"
case (name, pts) :: rest => s"top $name=$pts plus ${rest.size} more"
}
def main(args: Array[String]): Unit = {
println(report(Nil))
println(report(List(("Ann", 90))))
println(report(List(("Ann", 90), ("Bo", 80))))
}
}快速检查
测试您对解构的理解。
回顾
您已经学会在模式中解构数据:
- 使用
(a, b)拆分元组 - 使用
head :: tail或List(a, b)这样的精确形状拆分列表 Nil匹配空列表- 使用
_忽略部分内容,并嵌套模式来处理深层结构 - 拆分头部和尾部可以实现简洁的递归
用 AI 导师学习 Scala — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 39
- 课程
- 143
常见问题解答
「解构」课时是免费的吗?
是的 — 「解构」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 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 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「解构」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Scala for Backend Engineering & Functional Programming 课中编写并运行代码吗?
能。每节 Scala for Backend Engineering & Functional Programming 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。