Scala for Backend Engineering & Functional Programming · 课时

解构

从数据中提取内容

第 4 / 4 课13 个步骤

解构 是 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. match 表达式
  2. 匹配类型与值
  3. 守卫与绑定
  4. 解构
← 返回 Scala for Backend Engineering & Functional Programming