Scala学习笔记14: 模式匹配和样式类

目录

    • 第十四章 模式匹配和样式类
      • 1- 模式匹配
      • 2- 模式中的变量
      • 3- 类型模式
      • 4- 匹配数组、列表和元组等集合
      • 5- 样例类
      • 6- 守卫
      • 7- 提取器
      • 8- 变量声明中的模式
      • 9- for推导式中的模式
      • end

第十四章 模式匹配和样式类

在Scala中, 模式匹配和样例类是强大的功能, 用于处理复杂的数据结构和逻辑 ;

模式匹配是一种功能强大的机制, 可以根据数据的结构和属性进行匹配和处理 ;

样例类是一种特殊的类, 用于简化模式匹配和不可变性 .

1- 模式匹配

在Scala中, 模式匹配是一种强大的功能, 用于根据数据的结构和属性进行匹配和处理 ;

模式匹配类似于 switch 语句, 但更加灵活和功能丰富 ;

下面简单介绍Scala 中模式匹配的用法和特性 :

  1. 基本语法 :

    • Scala中的模式匹配使用 match 关键字, 结合 case 语句进行匹配

    • 示例:

    •     val x: Int = 2x match {case 1 => println("One")case 2 => println("Two")case _ => println("Other")}// 输出: Two
      
  2. 匹配类型 :

    • 可以根据数据类型进行匹配

    • 示例:

    •     // 匹配类型def matchType(x: Any): String = x match {case i: Int => s"Int: $i"case s: String => s"String: $s"case _ => "Other type"}println(matchType(1)) // 输出: Int: 1println(matchType("Hello")) // 输出: String: Helloprintln(matchType(true)) // 输出: Other type
      
  3. 匹配集合 :

    • 可以匹配集合中的元素

    • 示例:

    •     // 匹配集合val list = List(1, 2, 3, 4, 5)list match {case List(1, 2, 3, _, _) => println("List contains 1, 2, 3")case _ => println("Other list")}// 输出:List contains 1, 2, 3
      
  4. 匹配样例类 :

    • 可以使用样例类进行模式匹配

    • 示例:

    •     // 匹配样例类case class Person(name: String, age: Int)val person = Person("Tom", 18)val result = person match {case Person("Tom", 18) => "Tom is 18 years old"case _ => "unknown"}println(result) // 输出: Tom is 18 years oldval result2 = person match {case Person(name, age) => s"$name is $age years old"case _ => "unknown"}println(result2) // 输出: Tom is 18 years old
      
  5. 模式守卫 :

    • 可以使用模式守卫 (pattern guards) 对匹配条件进行进一步的限制 ;

    • 示例:

    •     // 模式守卫val x: Int = 10val y = x match {case i if i > 5 => "bigger than 5"case i if i < 5 => "smaller than 5"case _ => "equal to 5"}println(y) // Output: bigger than 5val z = x match {case even if even % 2 == 0 => "even"case odd if odd % 2 != 0 => "odd"case _ => "neither even nor odd"}println(s"$x is $z!") // Output: 10 is even!
      

通过模式匹配, 你可以根据不同的情况处理数据, 使代码更加清晰和易于理解 ;

模式匹配是Scala中强大且常用的功能之一, 适用于各种场景下的数据处理和逻辑判断 .

2- 模式中的变量

在Scala模式中, 变量模式 (Variable pattern) 是一种特殊的模式, 用于捕获匹配的值并将其绑定到变量上 ;

变量模式以小写字母开头, 可以在模式匹配中使用, 允许在匹配成功时将匹配的值赋值给变量 ;

如果关键字 case 后面跟着一个变量名, 那么匹配的表达式会被赋值给变量 ;

  1. 基本语法 :

    • 变量模式以小写字母开头, 用于捕获匹配的值 ;

    • 示例 :

    •     val x: Int = 22x match {case y => println(s"匹配到的值为: $y")}// Output: 匹配到的值为: 22
      
  2. 变量绑定 :

    • 变量模式还可以用于将匹配的值绑定到变量上, 以便后续使用 ;

    • 示例 :

    •     val x: Int = 6val result = x match {case z => z * 2}println(result) // Output: 12
      
  3. 使用场景 :

    • 变量模式适用于需要在模式匹配中捕获值并进行处理的情况 ;
    • 可以在模式匹配中使用变量模式来提取匹配值, 然后根据需要进行进一步的操作 ;

通过使用变量模式, 你可以在Scala模式匹配中灵活地捕获匹配的值并进行处理, 使得代码更加清晰和易于理解 ;

变量模式是模式匹配中常用且有用的一种模式, 适用于各种需要对匹配值进行操作的场景 .

3- 类型模式

在Scala中, 类型模式(type pattern) 是一种模式匹配的方式, 用于匹配特定的数据类型 ;

类型模式允许你根据数据的类型进行匹配, 并执行相应的操作 ;

  1. 基本语法 :

    • 类型模式用于匹配特定的数据类型, 通常与 case 语句结合使用 ;

    • 示例 :

    •     // 类型匹配def matchType(x: Any) = x match {case i: Int => s"int: $i"case s: String => s"string $s"case _ => "other"}println(matchType(1)) // int: 1println(matchType("a")) // string aprintln(matchType(true)) // otherprintln(matchType(List(1, 2, 3))) // other
      
  2. 使用场景 :

    • 类型模式适用于需要根据数据类型进行不同处理的情况 ;
    • 可以根据数据的类型来选择不同的逻辑分支, 实现更灵活的数据处理 ;
  3. 类型擦除 :

    • 在Scala中, 由于类型擦除的存在, 有时候无法直接匹配泛型类型 ;
    • 可以使用类型擦除后的类型进行匹配, 或者通过 ClassTag 等方式来处理泛型类型 ;

通过使用类型模式, 你可以根据数据的类型进行精确的匹配和处理, 使得代码更加灵活和具有表现力 ;

类型模式是Scala模式匹配中常用的一种模式, 适用于需要根据数据类型进行不同处理的各种场景 .

4- 匹配数组、列表和元组等集合

在Scala中, 模式匹配可以用于匹配数组、列表和元组等集合类型 ;

  1. 匹配数组 :

    • 使用 Array 类型进行匹配 ;

    • 示例:

    •     // 匹配数组val arr = Array(1, 2, 3, 4, 5)val result = arr match {case Array(1, _, _, _, _) => "匹配到数组的第一个元素为1"case Array(_, 2, _, _, _) => "匹配到数组的第二个元素为2"case Array(_, _, 3, _, _) => "匹配到数组的第三个元素为3"case Array(_, _, _, 4, _) => "匹配到数组的第四个元素为4"case Array(_, _, _, _, 5) => "匹配到数组的第五个元素为5"}println(result) // Output: 匹配到数组的第一个元素为1val result2 = arr match {case Array(1, 2, 3, 4, 5) => "匹配到数组[1, 2, 3]"case _ => "其它数组"}println(result2) // Output: 匹配到数组[1, 2, 3]
      
  2. 匹配列表 :

    • 使用 List 类型进行匹配 ;

    • 示例:

    •     // 匹配列表val list = List(1, 2, 3, 4, 5)list match {case List(1, 2, 3, 4, 5) => println("匹配成功, 列表[1, 2, 3, 4, 5]")case _ => println("匹配失败")}// Output: 匹配成功, 列表[1, 2, 3, 4, 5]
      
  3. 匹配元组 :

    • 使用元组类型进行匹配 ;

    • 示例 :

    •     // 匹配元组val t1 = (1, "a", 3.14, "π")t1 match {case (1, "a", 3.14, "π") => println("匹配到元组(1, \"a\", 3.14, \"π\")")case _ => println("其它元组")}// Output: 匹配到元组(1, "a", 3.14, "π")val t = (1, 2, "v")t match {case (a, b, c) => println(a + b + c)case _ => println("default")}// Output: 3v
      

通过以上示例, 你可以看到如何在Scala中使用模式匹配类匹配数组、列表和元组等集合类型 ;

模式匹配是Scala中强大且灵活的特性, 可以帮助你根据不同的数据结构进行精确的匹配和处理 .

5- 样例类

在Scala中 , 样例类 (case class) 是一种特殊的类, 用于表示不可变的数据结构 ;

样例类具有许多有用的特性, 使其在模式匹配和不可变数据建模方面非常有用 ;

  1. 定义样例类 :

    • 样例类使用 case class 关键字进行定义, 通常用于表示数据结构 ;

    • 示例 :

    • case class Person(name: String, age: Int)
      
  2. 特性 :

    • 样例类自动提供了 equalshashCodetoString 方法的实现 ;
    • 样例类的构造器参数默认是 val , 使其成为不可变的数据结构 ;
    • 可以使用模式匹配类处理样例类的实例 ;
  3. 模式匹配 :

    • 样例类子啊模式匹配中非常有用, 可以根据不同的样例类进行不同的处理 ;

    • 示例 :

    •     // 样例类 模式匹配case class Person(name: String, age: Int)val person = Person("zhangsan", 18)val result = person match {case Person("zhangsan", 18) => "zhangsan is 18"case Person("zhangsan", 19) => "zhangsan is 19"case _ => "other"}println(result) // Output: zhangsan is 18val result2 = person match {case Person(name, age) => s"$name is $age"case _ => "other"}println(result2) // Output: zhangsan is 18
      
  4. 不可变性 :

    • 样例类的实例时不可变的, 这意味着一旦创建就无法更改其内容 ;
    • 这种不可变性使得样例类在函数式编程和数据建模中非常有用 ;

通过使用样例类, 你可以轻松地表示不可变的数据结构, 并利用Scala强大的模式匹配功能来处理这些数据 ;

样例类是Scala中常用的概念, 用于简化数据建模和模式匹配的过程 .

6- 守卫

在Scala中, 模式匹配中的守卫 (guards) 是一种强大的机制, 允许在 scae 语句中添加布尔表达式作为额外条件, 以进一步细化匹配的逻辑 ;

当模式匹配遇到带有守卫的 case 语句时, 只有当守卫条件为真时, 才会执行该 case 语句 ;

这使得模式匹配更加灵活, 能够根据特定条件选择不同的分支逻辑 ;

  1. 基本语法 :

    • 守卫是在 case 语句后使用 if 关键字加上布尔表达式来定义的 ;

    • 示例 :

    •     val a: Int = 12a match {case even if a % 2 == 0 => println(s"$even 是偶数")case odd if a % 2 == 1 =>  println(s"$odd 是奇数")}// Output: 12 是偶数
      
  2. 使用场景 :

    • 守卫允许根据更复杂的条件进行模式匹配, 例如数值的特定属性或范围 ;
    • 可以在模式匹配中结合守卫实现更精细的逻辑控制, 避免冗长的嵌套 if-else 语句 ;
  3. 灵活性 :

    • 守卫条件可以是任何布尔表达式, 可以包含逻辑运算、比较操作等 ;
    • 守卫使得模式匹配更具表现力和可读性, 能够处理更多复杂的匹配情况 ;

通过使用守卫, 你可以根据额外的条件对模式匹配进行细致化的控制, 使得代码更加清晰和易于维护 ;

守卫是Scala模式匹配中的重要特性 , 为处理各种匹配情况提供了更多的灵活性和表达能力 .

7- 提取器

在Scala中, 提取器 (Extractor) 是一种用于模式匹配的对象, 它定义了从输入中提取出构造参数的逻辑;

提取器通常用于将对象分解为其组成部分, 以便在模式匹配中使用 ;

提取器对象必须包含 unapply 方法, 用于从输入中提取值 ;

  1. 基本语法 :

    • 提取器对象通常包含 unapply 方法, 用于提取值并返回一个 Option 类型的结果 ;

    • 示例 :

    •     object Email {def unapply(email: String): Option[(String, String)] = {val parts = email.split("@")if (parts.length == 2) {Some(parts(0), parts(1))} else {None}}}val email = "zhangsan@163.com"val Email(name, domain) = emailprintln(name) // Output: zhangsanprintln(domain) // Output: 163.com
      
  2. 模式匹配中的应用 :

    • 提取器通常与模式匹配结合使用, 允许从对象中提取数据并进行匹配 ;

    • 示例 :

    •     object Email {def unapply(email: String): Option[(String, String)] = {val parts = email.split("@")if (parts.length == 2) {Some(parts(0), parts(1))} else {None}}}// 模式匹配中使用 提取器val email = "john.doe@gmail.com"email match {case Email(name, domain) => println(s"Name: $name, Domain: $domain")case _ => println("Invalid email format!")}// Output: Name: john.doe, Domain: gmail.com
      
  3. 提取器对象 :

    • 提取器对象可以定义多个 unapply 方法重载, 以适应不同的匹配情况 ;
    • 提取器对象还可定义 unapplySeq 方法用于提取序列类型的值 ;

通过使用提取器, 你可以在Scala中更加灵活地进行模式匹配, 从复杂的数据结构中提取所需的信息 ;

提取器是Scala模式匹配的重要组成部分, 使得代码更具表现力和可读性 .

8- 变量声明中的模式

在Scala中, 变量声明中的模式 (pattern) 允许你在声明变量时使用模式匹配的方式 ;

这种模式匹配的变量声明方式可以帮助你从复杂的数据结构中提取所需的部分, 并将其赋值给变量 ;

  1. 基本语法 :

    • 在变量声明时, 可以使用模式匹配的方式来提取数据并赋值给变量 ;

    • 示例 :

    •     val (x, y) = (1, 2) // 将元组(1, 2) 赋值给变量 x, yprintln(x) // Output: 1println(y) // Output: 2
      
  2. 匹配复杂数据结构 :

    • 变量声明中的模式允许你从各种数据结构中提取数据, 如元组、列表、样例类等 ;

    • 示例 :

    •     val List(a, b, c) = List(1, 2, 3)println(a) // Output: 1println(b) // Output: 2println(c) // Output: 3
      
  3. 匹配嵌套结构 :

    • 可以在变量声明中使用模式匹配来处理嵌套的数据结构, 如元组中包含元组的情况 ;

    • 示例 :

    •     val ((x, y), z) = ((1, 2), 3) // 从嵌套的元组中提取值并赋给变量 x y zprintln(x) // Output: 1println(y) // Output: 2println(z) // Output: 3
      

通过在变量声明中使用模式, 你可以更加灵活地从数据结构中提取所需的部分, 并将其赋值给变量, 使得代码更具表现力和简洁性 ;

这种模式匹配的变量声明方式在处理复杂数据结构时非常有用 .

9- for推导式中的模式

在Scala中, for 推导式中的模式匹配是一种强大的功能, 允许你在遍历集合或序列时使用模式匹配来接受元素并提取所需的部分 ;

  1. 基本语法 :

    • for 推导式中, 可以使用模式匹配来接受集合中的元素, 并将匹配的部分赋值给变量 ;

    • 示例 :

    •     val list = List((1, "one"), (2, "two"), (3, "three"))for (elem <- list) {val (num, str) = elemprintln(s"num: $num, str: $str")}/*num: 1, str: onenum: 2, str: twonum: 3, str: three*/
      
  2. 匹配嵌套结构 :

    • 你可以在 for 推到式中使用模式匹配来处理嵌套的数据结构, 如元组中包含元组的情况 ;

    • 示例 :

    •     val nestList = List((1, "one", true), (2, "two", false), (3, "three", true))for ((num, str, bool) <- nestList) {println(s"Number: $num, Name: $str, Flage: $bool")}/*Number: 1, Name: one, Flage: trueNumber: 2, Name: two, Flage: falseNumber: 3, Name: three, Flage: true*/
      
  3. 过滤条件 :

    • 可以结合模式匹配和条件表达式来过滤元素, 只处理符合条件的部分 ;

    • 示例 :

    •     val nestList = List((1, "one", true), (2, "two", false), (3, "three", true))for ((num, str, bool) <- nestList if bool == true) {println(s"Number: $num, Name: $str, Flage: $bool")}/*Number: 1, Name: one, Flage: trueNumber: 3, Name: three, Flage: true*/
      

通过在 for 推导式中使用模式匹配, 可以更加灵活地处理集合中的元素, 从而简化代码并提高可读性 ;

模式匹配在 for 循环中的应用使得处理复杂数据结构变得更加方便和直观 .

end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/857189.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

虚拟现实(VR)游戏与增强现实(AR)游戏的区别

随着科技的飞速发展&#xff0c;沉浸式游戏体验已经成为现代娱乐的重要组成部分。虚拟现实&#xff08;VR&#xff09;游戏和增强现实&#xff08;AR&#xff09;游戏是这类体验中的两大主流&#xff0c;但它们在技术实现、用户体验和应用场景上有显著的区别。本文将详细探讨VR…

Java 从 6 到 21 的重要变动回顾

Java 从 6 到 21 的重要变动回顾 Java 自从发布以来&#xff0c;一直是全球最受欢迎的编程语言之一。其不断发展的特性和功能&#xff0c;使得它在各种应用程序中得以广泛应用。从 Java 6 到 Java 21&#xff0c;Java 语言和平台经历了许多重要的变动。本文将深入探讨这些变动…

可信启动Trusted Board Boot

TBB Trusted Board Boot&#xff08;TBB&#xff09;对所有固件镜像&#xff08;包括普通世界的bootloader&#xff09;进行身份验证&#xff0c;以防止恶意固件在平台上运行。TBB使用公钥加密标准 &#xff08;PKCS&#xff09;来建立信任链&#xff08;Chain of Trust&#…

EtherCAT扫盲,都是知识点

1. 什么是EtherCAT EtherCAT&#xff0c;全称Ethernet for Control Automation Technology&#xff0c;字面意思就是用于控制自动化技术的以太网。它是一种基于以太网的实时工业通信协议&#xff0c;简单说&#xff0c;就是让机器们通过网线互相聊天的高级方式。 EtherCAT 是最…

项目训练营第三天

项目训练营第三天 注册登录测试 前面我们编写了用户注册、登录的逻辑代码&#xff0c;每编写完一个功能模块之后&#xff0c;我们都要对该模块进行单元测试&#xff0c;来确保该功能模块的正确性。一般情况下使用快捷键Ctrl Shift Insert&#xff0c;鼠标左击类名可以自动生…

全新的会声会影2024最新官方免费永久破解版本下载

大家好&#xff01;&#x1f31f; 今天要跟大家分享一个超级棒的视频编辑软件&#xff0c;它就是全新的会声会影2024最新永久破解版本。作为视频创作爱好者的我&#xff0c;真的被这款软件的强大功能和便利性彻底征服了&#xff01;&#x1f389;&#x1f389;&#x1f3ac; 【…

Aidlux 1.4 部署Nextcloud 2024.6实录 没成功

Aidux阉割版Debain10&#xff0c;坑很多&#xff0c;比如找不到实际的系统日志&#xff0c;有知道的大神吗&#xff1f; 1 Apache2安装 # 测试Apache2 sudo apt update && sudo apt upgrade sudo apt install apache2 -y80端口疑似被禁止只能换端口 rootlocalhost:/…

网络爬虫requests库使用指南

目录 引言 安装requests库 基本用法 发送GET请求 发送POST请求 处理请求头和Cookies 设置请求头 使用Cookies 会话管理 异常处理 流式上传和下载 结语 引言 在Python中进行HTTP请求时&#xff0c;requests库是一个强大且易于使用的第三方库。它允许你发送各种HTTP请…

Java中如何处理异常?

在Java中处理异常是确保软件健壮性和提高代码质量的重要手段。以下是Java异常处理的一些关键点和最佳实践&#xff1a; 1&#xff1a;理解异常类型&#xff1a; Java中的异常分为检查异常&#xff08; checked exceptions&#xff09;和非检查异常&#xff08;un-checked exc…

RK3568技术笔记十六 QT5开发

背景知识 在阅读本章前&#xff0c;如果对下面所列举的知识点有一定的了解&#xff0c;将有助于更好的理解本章内容。 C基础知识&#xff0c;了解简单的类&#xff0c;继承&#xff0c;重载等面向对象概念&#xff1b;Linux基础知识&#xff0c;了解基本的Shell命令&#xff…

普通变频器位置闭环控制(S7-1200PLC工艺对象模拟量轴)

1、S7-1200PLC控制V90总线伺服通过工艺对象实现定位控制 S7-1200PLC和V90总线伺服通过工艺对象实现定位控制(标准报文3应用)_1200报文3控制v90-CSDN博客文章浏览阅读182次。V90伺服驱动器调试软件SINAMICS V-ASSISTANT Commissioning tool下载地址如下:西门子官网选型|资料CS…

开启文物保护新篇章——智能RFID文物藏品库房管理系统

在历史的长河中&#xff0c;文物不仅是见证文明的瑰宝&#xff0c;更是文化传承的重要载体。这些承载着丰富历史和文化价值的珍贵文物&#xff0c;需要得到科学、精细的保护和管理。为了更好地守护和传承我们的文化遗产&#xff0c;我们荣幸地推出智能RFID文物藏品库房管理系统…

搜维尔科技:力反馈主手—手术机器人应用〈腔镜手术机器人平台—进入手术室动物实验〉

力反馈主手—手术机器人应用〈腔镜手术机器人平台—进入手术室动物实验〉 搜维尔科技&#xff1a;力反馈主手—手术机器人应用〈腔镜手术机器人平台—进入手术室动物实验〉

Python武器库开发-武器库篇之Redis未授权漏洞一键Getshell(五十八)

Python武器库开发-武器库篇之Redis未授权漏洞一键Getshell(五十八) Redis 默认情况下&#xff0c;会绑定在 0.0.0.0:6379&#xff0c;如果没有进⾏采⽤相关的策略&#xff0c;⽐如添加防⽕墙规则避免其他⾮信任来源 ip 访问等&#xff0c;这样将会将 Redis 服务暴露到公⽹上&a…

【自动驾驶】运动底盘状态数据:里程计、IMU、运动学分析、串口通信协议

文章目录 控制器与运动底盘状态数据:里程计、IMU运动学分析与轮子运动学分析公式串口通信控制与反馈通讯协议串口通信反馈上行数据帧解析串口通信控制下行数据帧解析代码实现IMU、里程计数据的获取、解析、计算控制器与运动底盘状态数据:里程计、IMU 控制器需要负责外发底盘…

Matplotlib绘制一个X轴2个Y轴的图表

import matplotlib matplotlib.use(Agg) # 使用Agg后端&#xff0c;这个后端适用于生成图像文件但不显示它们 import matplotlib.pyplot as plt fig plt.figure(figsize(15, 8))# 字体使用楷体 matplotlib.rc("font", family"Microsoft YaHei") ax1 fig…

整合第三方技术-整合JUnit

黑马程序员Spring Boot2 文章目录 名称&#xff1a;SpringBootTest类型&#xff1a;测试类注解位置&#xff1a;测试类定义上方作用&#xff1a;设置JUnit加载的SpringBoot启动类范例&#xff1a;

短视频外卖服务商怎么做?快速通道及申请条件解析

近日&#xff0c;某音官方于某音电商学习中心发布了关于新增《【到家外卖】内容服务商开放准入公告》的意见征集通知&#xff08;以下简称“通知”&#xff09;&#xff0c;宣布了某音外卖即将正式开放的消息。随后&#xff0c;以某音外卖服务商怎么做为代表的相关问题也在多个…

定义和反射Annotation类(注解)

文章目录 前言一、定义Annotation类二、反射Anootation类 1.元注解2.反射注解总结 前言 在写代码的过程中&#xff0c;我们经常会写到注释&#xff0c;以此来提醒代码中的点。但是&#xff0c;这些注释不会被查看&#xff0c;也不在整个代码之中&#xff0c;只能在源代码中进行…

适合PbootCMS的阿里云短信发送类

前言介绍 一款大佬分享的简单方便阿里云短信封装代码&#xff0c;不用官网复杂的SDK&#xff0c;快速上手。 现在我把它适配成pbootcms&#xff0c;可以拿来快速制作短信发送功能。 封装代码 <?php /*** author CMS88* 阿里云SMS*/ namespace core\sms; use core\basi…