🎬 HoRain云小助手:个人主页
🔥 个人专栏: 《Linux 系列教程》《c语言教程》
⛺️生活的理想,就是为了理想的生活!
⛳️ 推荐
前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。
专栏介绍
| 专栏名称 |
专栏介绍 |
| 《C语言》 |
本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。 |
| 《网络协议》 |
本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制! |
| 《docker容器精解篇》 |
全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。 |
| 《linux系列》 |
本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。 |
| 《python 系列》 |
本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。 |
| 《试题库》 |
本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、C***A等) |
目录
⛳️ 推荐
专栏介绍
1. 基本语法与概念
2. 丰富的匹配模式
3. 守卫条件 (Guards)
4. 密封类 (Sealed Class) 与模式匹配
5. 在赋值和函数中的应用
总结
Scala 的模式匹配是其最强大、最常用的特性之一,它远不止是其他语言中的 switch 语句,而是一个功能丰富的解构和条件执行工具。
1. 基本语法与概念
模式匹配的核心是 match 表达式。其基本语法如下:
selectorExpression match {
case pattern1 => expression1
case pattern2 => expression2
case pattern3 if condition => expression3 // 带守卫的条件
case _ => defaultExpression // 默认情况(通配符)
}
match 是一个表达式,这意味着它总是会返回一个值。每个 case 子句尝试将 selectorExpression 的结果与其 pattern 进行匹配,成功则执行并返回对应的 expression。
2. 丰富的匹配模式
Scala 模式匹配的强大之处在于其支持多种多样的模式。
-
常量匹配:匹配具体的常量值(数字、字符串、布尔值等)。
def describe(x: Any): String = x match { case 5 => "five" case true => "truth" case "hello" => "hi!" case _ => "something else" } -
变量匹配:如果
case后是一个小写字母开头的标识符,它会被当作变量捕获匹配的值。val anyNum = 42 match { case n => s"This is the number $n" // n 捕获了 42 } -
通配符匹配:使用下划线
_匹配任何值,通常用作默认情况。 -
类型匹配:检查输入的表达式的类型,这是非常实用的功能。
def process(input: Any): String = input match { case s: String => s"Received a string: '$s'" case i: Int if i > 0 => s"Received a positive integer: $i" case l: List[_] => s"Received a list of size ${l.size}" case _ => "Unknown type" } -
Case Class 解构:这是模式匹配的“杀手级”应用。Case Class 天生就是为了模式匹配而设计的,可以轻松地解构出其字段值。
case class Person(name: String, age: Int) val alice = Person("Alice", 25) alice match { case Person(n, a) => println(s"Name: $n, Age: $a") // 解构出 n="Alice", a=25 case _ => println("Unknown person") } -
序列(List/Array)匹配:可以匹配列表的开头、结尾或特定结构。
val myList = List(1, 2, 3) myList match { case List(1, second, third) => println(s"Starts with 1, then $second, $third") case List(1, _*) => println("Starts with 1, ignoring the rest") // 使用 _* 匹配剩余元素 case Nil => println("Empty list") case _ => println("Something else") } -
元组匹配:可以匹配和解构元组。
val aTuple = (1, "hello") aTuple match { case (number, greeting) => println(s"$number, $greeting") }
3. 守卫条件 (Guards)
可以在 case 语句后使用 if 关键字来添加额外的逻辑条件,这被称为“守卫”。
def checkSign(x: Int): String = x match {
case n if n > 0 => "Positive"
case n if n < 0 => "Negative"
case _ => "Zero"
}
4. 密封类 (Sealed Class) 与模式匹配
在定义用于模式匹配的类层次结构时,使用 sealed 关键字是最佳实践。sealed 要求所有子类都必须定义在同一个文件中,这样编译器就能知晓所有可能的情况。当你匹配一个密封类的实例时,如果漏掉了某些 case,编译器会发出警告,这极大地增强了代码的安全性和可维护性。
sealed trait Notification
case class Email(sender: String, title: String) extends Notification
case class SMS(caller: String, message: String) extends Notification
case class VoiceRecording(contactName: String, link: String) extends Notification
def showNotification(notification: Notification): String = notification match {
case Email(sender, title) => s"You got an email from $sender with title: $title"
case SMS(number, message) => s"You got an SMS from $number! Message: $message"
// 如果注释掉 VoiceRecording 的 case,编译器会警告匹配不全
case VoiceRecording(name, link) => s"You received a voice recording from $name. Click here: $link"
}
5. 在赋值和函数中的应用
模式匹配不仅限于 match 表达式。
-
解构赋值:可以直接将 Case Class 或元组的值解构到变量中。
val (number, text) = (100, "hello") // number = 100, text = "hello" val Person(name, age) = Person("Bob", 30) // name = "Bob", age = 30 -
偏函数 (PartialFunction):偏函数是只对输入值域中一部分参数进行处理的函数,其本质就是由一系列
case语句包裹的模式匹配。val squareRoot: PartialFunction[Double, Double] = { case x if x >= 0 => Math.sqrt(x) } squareRoot.isDefinedAt(4) // true squareRoot.isDefinedAt(-1) // false
总结
Scala 的模式匹配是一个强大、通用且安全的核心特性。它通过 match 表达式、丰富的模式类型(常量、类型、Case Class 解构、序列等)、守卫条件以及与密封类的结合,实现了对数据的优雅、简洁且安全的检查和解构。它不仅是控制流的选择工具,更是函数式编程中数据处理的基石,广泛应用于各种场景,从简单的值判断到复杂数据结构的分析和转换。编译器对密封类模式匹配完整性的检查进一步提升了代码的可靠性。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙