Scala第十一章节(掌握模式匹配相关内容)

1.模式匹配

Scala中有一个非常强大的模式匹配机制,应用也非常广泛, 例如:

  • 判断固定值
  • 类型查询
  • 快速获取数据

1.1 简单模式匹配

一个模式匹配包含了一系列备选项,每个备选项都开始于关键字 case。且每个备选项都包含了一个模式及一到多

个表达式。箭头符号 => 隔开了模式和表达式。

格式
变量 match {
case "常量1" => 表达式1
case "常量2" => 表达式2
case "常量3" => 表达式3
case _ => 表达式4 // 默认匹配项
}
执行流程
  1. 先执行第一个case, 看 变量值 和 该case对应的常量值 是否一致.
  2. 如果一致, 则执行该case对应的表达式.
  3. 如果不一致, 则往后执行下一个case, 看 变量值 和 该case对应的常量值 是否一致.
  4. 以此类推, 如果所有的case都不匹配, 则执行 case _ 对应的表达式.
需求
  1. 提示用户录入一个单词并接收.
  2. 判断该单词是否能够匹配以下单词,如果能匹配,返回一句话
  3. 打印结果.
单词返回
hadoop大数据分布式存储和计算框架
zookeeper大数据分布式协调服务框架
spark大数据分布式内存计算框架
未匹配未匹配
参考代码
import scala.io.StdIn
//案例: 模式匹配之简单匹配
object ClassDemo01 {
def main(args: Array[String]): Unit = {
//1. 提示用户录入字符串并接收.
println("请录入一个字符串: ")
var str = StdIn.readLine()
//2. 判断字符串是否是指定的内容, 并接收结果.
val result = str match {
case "hadoop" => "大数据分布式存储和计算框架"
case "zookeeper" => "大数据分布式协调服务框架"
case "spark" => "大数据分布式内存计算框架"
case _ => "未匹配"
}
//3. 打印结果.
println(result)
println("-" * 15) //分割线.
//简写形式
str match {
case "hadoop" => println("大数据分布式存储和计算框架")
case "zookeeper" => println("大数据分布式协调服务框架")
case "spark" => println("大数据分布式内存计算框架")
case _ => println("未匹配")
}
}
}

1.2 匹配类型

除了匹配数据之外, match表达式还可以进行类型匹配。如果我们要根据不同的数据类型,来执行不同的逻辑,也可以使用match表达式来实现。

格式
对象名 match {
case 变量名1: 类型1 => 表达式1
case 变量名2: 类型2 => 表达式2
case 变量名3: 类型3 => 表达式3
...
case _ => 表达式4
}

注意: 如果case表达式中无需使用到匹配到的变量,可以使用下划线代代

需求
  1. 定义一个变量为Any类型,然后分别给其赋值为"hadoop"、1、1.0
  2. 定义模式匹配,然后分别打印类型的名称
参考代码
//案例: 模式匹配之匹配类型
object ClassDemo02 {
def main(args: Array[String]): Unit = {
//1. 定义一个变量为Any类型,然后分别给其赋值为"hadoop"、1、1.0
val a:Any = 1.0
//2. 定义模式匹配,然后分别打印类型的名称
val result = a match {
case x:String => s"${x} 是String类型的数据"
case x:Double => s"${x} 是Double类型的数据"
case x:Int => s"${x} 是Int类型的数据"
case _ => "未匹配"
}
//3. 打印结果
println(result)
//4. 优化版, 如果在case校验的时候, 变量没有被使用, 则可以用_替代.
val result2 = a match {
case _:String => "String"
case _:Double => "Double"
case _:Int => "Int"
case _ => "未匹配"
}
//打印结果
println(result2)
}
}

1.3 守卫

所谓的守卫指的是 在case语句中添加if条件判断 , 这样可以让我们的代码更简洁, 更优雅.

格式
变量 match {
case 变量名 if条件1 => 表达式1
case 变量名 if条件2 => 表达式2
case 变量名 if条件3 => 表达式3
...
case _ => 表达式4
}
需求
  1. 从控制台读入一个数字a(使用StdIn.readInt)
  2. 如果 a >= 0 而且 a <= 3,打印[0-3]
  3. 如果 a >= 4 而且 a <= 8,打印[4,8]
  4. 否则,打印未匹配
参考代码
//案例: 模式匹配之守卫
object ClassDemo03 {
def main(args: Array[String]): Unit = {
//1. 从控制台读入一个数字a(使用StdIn.readInt)
println("请录入一个整数: ")
var num = StdIn.readInt()
//2. 模式匹配
num match {
//2.1 如果 a >= 0 而且 a <= 3,打印[0-3]
case a if a >= 0 && a <= 3 => println("[0-3]")
//2.2 如果 a >= 4 而且 a <= 8,打印[4,8]
case a if a >= 4 && a <= 8 => println("[4-8]")
//2.3 否则,打印未匹配
case _ => println("未匹配")
}
}
}

1.4 匹配样例类

Scala中可以使用模式匹配来匹配样例类,从而实现可以快速获取样例类中的成员数据。后续,我们在开发Akka案

例时,还会经常用到。

格式
对象名 match {
case 样例类型1(字段1, 字段2, 字段n) => 表达式1
case 样例类型2(字段1, 字段2, 字段n) => 表达式2
case 样例类型3(字段1, 字段2, 字段n) => 表达式3
...
case _ => 表达式4
}
  1. 样例类型后的小括号中, 编写的字段个数要和该样例类的字段个数保持一致.
  2. 通过match进行模式匹配的时候, 要匹配的对象必须声明为: Any类型.
需求
  1. 创建两个样例类Customer(包含姓名, 年龄字段), Order(包含id字段)
  2. 分别定义两个样例类的对象,并指定为Any类型
  3. 使用模式匹配这两个对象,并分别打印它们的成员变量值
参考代码
//案例: 模式匹配之匹配样例类
object ClassDemo04 {
//1. 创建两个样例类Customer、Order
//1.1 Customer包含姓名、年龄字段
case class Customer(var name: String, var age: Int)
//1.2 Order包含id字段
case class Order(id: Int)
def main(args: Array[String]): Unit = {
//2. 分别定义两个案例类的对象,并指定为Any类型
val c: Any = Customer("糖糖", 73)
val o: Any = Order(123)
val arr: Any = Array(0, 1)
//3. 使用模式匹配这两个对象,并分别打印它们的成员变量值
c match {
case Customer(a, b) => println(s"Customer类型的对象, name=${a}, age=${b}")
case Order(c) => println(s"Order类型, id=${c}")
case _ => println("未匹配")
}
}
}

1.5 匹配集合

除了上述功能之外, Scala中的模式匹配,还能用来匹配数组, 元组, 集合(列表, 集, 映射)等。

1.5.1 示例一: 匹配数组
需求
  1. 依次修改代码定义以下三个数
Array(1,x,y) // 以1开头,后续的两个元素不固定
Array(0) // 只匹配一个0元素的元素
Array(0, ...) // 可以任意数量,但是以0开头
  1. 使用模式匹配, 匹配上述数组.
参考代码
//案例: 模式匹配之匹配数组
object ClassDemo05 {
def main(args: Array[String]): Unit = {
//1. 定义三个数组.
val arr1 = Array(1, 2, 3)
val arr2 = Array(0)
val arr3 = Array(1, 2, 3, 4, 5)
//2. 通过模式匹配, 找到指定的数组.
arr2 match {
//匹配: 长度为3, 首元素为1, 后两个元素无所谓.
case Array(1, x, y) => println(s"匹配长度为3, 首元素为1, 后两个元素是: ${x}, ${y}")
//匹配: 只有一个0元素的数组
case Array(0) => println("匹配: 只有一个0元素的数组")
//匹配: 第一个元素是1, 后边元素无所谓的数组.
case Array(1, _*) => println("匹配: 第一个元素是1, 后边元素无所谓的数组")
//其他校验项
case _ => println("未匹配")
}
}
}
1.5.2 示例二:匹配列表
需求
  1. 依次修改代码定义以下三个列表
List(0) // 只保存0一个元素的列表
List(0,...) // 以0开头的列表,数量不固定
List(x,y) // 只包含两个元素的列表
  1. 使用模式匹配, 匹配上述列表.
参考代码
//案例: 模式匹配之匹配列表
object ClassDemo06 {
def main(args: Array[String]): Unit = {
//1. 定义列表.
var list1 = List(0)
var list2 = List(0, 1, 2, 3, 4, 5)
var list3 = List(1, 2)
//2. 通过match进行模式匹配
//思路一: 通过List()来实现.
list1 match {
case List(0) => println("匹配: 只有一个0元素的列表")
case List(0, _*) => println("匹配: 0开头, 后边元素无所谓的列表")
case List(x, y) => println(s"匹配: 只有两个元素的列表, 元素为: ${x}, ${y}")
case _ => println("未匹配")
}
//思路二: 采用关键字优化 Nil, tail
list1 match {
case 0 :: Nil => println("匹配: 只有一个0元素的列表")
case 0 :: tail => println("匹配: 0开头, 后边元素无所谓的列表")
case x :: y :: Nil => println(s"匹配: 只有两个元素的列表, 元素为: ${x}, ${y}")
case _ => println("未匹配")
}
}
}
1.5.3 案例三:匹配元组
需求
  1. 依次修改代码定义以下两个元组
(1, x, y) // 以1开头的、一共三个元素的元组
(x, y, 5) // 一共有三个元素,最后一个元素为5的元组
  1. 使用模式匹配, 匹配上述元组.
参考代码
//案例: 模式匹配之匹配元组
object ClassDemo07 {
def main(args: Array[String]): Unit = {
//1. 定义两个元组.
val a = (1, 2, 3)
val b = (3, 4, 5)
val c = (3, 4)
//2. 通过模式匹配, 匹配指定的元素
a match {
case (1, x, y) => println(s"匹配: 长度为3,1开头, 后两个元素无所谓的元组, 这里后两个元素
是: ${x}, ${y}")
case (x, y, 5) => println(s"匹配: 长度为3,5结尾, 前两个元素无所谓的元素, 这里前两个元素
是: ${x}, ${y}")
case _ => println("未匹配")
}
}
}

1.6 变量声明中的模式匹配

在定义变量时,可以使用模式匹配快速获取数据. 例如: 快速从数组,列表中获取数据 .

需求
  1. 生成包含0-10数字的数组,使用模式匹配分别获取第二个、第三个、第四个元素

  2. 生成包含0-10数字的列表,使用模式匹配分别获取第一个、第二个元素

参考代码
//案例: 演示变量声明中的模式匹配.
object ClassDemo08 {
def main(args: Array[String]): Unit = {
//1. 生成包含0-10数字的数组,使用模式匹配分别获取第二个、第三个、第四个元素
//1.1 生成包含0-10数字的数组
val arr = (0 to 10).toArray
//1.2 使用模式匹配分别获取第二个、第三个、第四个元素
val Array(_, x, y, z, _*) = arr;
//1.3 打印结果.
println(x, y, z)
println("-" * 15)
//2. 生成包含0-10数字的列表,使用模式匹配分别获取第一个、第二个元素
//2.1 生成包含0-10数字的列表,
val list = (0 to 10).toList
//2.2 使用模式匹配分别获取第一个、第二个元素
//思路一: List() 实现
val List(a, b, _*) = list
//思路二: ::, tail 实现.
val c :: d :: tail = list
//2.3 打印结果.
println(a, b)
println(c, d)
}
}

1.7 匹配for表达式

Scala中还可以使用模式匹配来匹配for表达式,从而实现快速获取指定数据, 让我们的代码看起来更简洁, 更优雅.

需求
  1. 定义变量记录学生的姓名和年龄, 例如: “张三” -> 23, “李四” -> 24, “王五” -> 23, “赵六” -> 26
  2. 获取所有年龄为23的学生信息, 并打印结果.
参考代码
//案例: 模式匹配之匹配for表达式.
object ClassDemo09 {
def main(args: Array[String]): Unit = {
//1. 定义变量记录学生的姓名和年龄.
val map1 = Map("张三" -> 23, "李四" -> 24, "王五" -> 23, "赵六" -> 26)
//2. 获取所有年龄为23的学生信息.
//2.1 格式一: 通过if语句实现.
for((k,v) <- map1 if v == 23) println(s"${k} = ${v}")
//分割线.
println("-" * 15)
//2.2 格式二: 通过固定值实现.
for((k, 23) <- map1) println(k + " = 23")
}
}

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

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

相关文章

应急响应靶机训练-Web3题解

前言 接上文&#xff0c;应急响应靶机训练-Web3。 前来挑战&#xff01;应急响应靶机训练-Web3 题解 首先登录用户administrator 寻找隐藏用户 找到隐藏用户hack6618$ 然后去找apache的日志文件 分析得出两个IP地址 192.168.75.129 192.168.75.130 然后更换hack6618$的…

Python 深度学习第二版(GPT 重译)(二)

四、入门神经网络&#xff1a;分类和回归 本章涵盖 您的第一个真实世界机器学习工作流示例 处理矢量数据上的分类问题 处理矢量数据上的连续回归问题 本章旨在帮助您开始使用神经网络解决实际问题。您将巩固从第二章和第三章中获得的知识&#xff0c;并将所学应用于三个新…

Flink RocksDB状态后端优化总结

截至当前&#xff0c;Flink 作业的状态后端仍然只有 Memory、FileSystem 和 RocksDB 三种可选&#xff0c;且 RocksDB 是状态数据量较大&#xff08;GB 到 TB 级别&#xff09;时的唯一选择。RocksDB 的性能发挥非常仰赖调优&#xff0c;如果全部采用默认配置&#xff0c;读写性…

sheng的学习笔记-AI-Inception network

目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 基础知识 构建卷积层时&#xff0c;你要决定过滤器的大小究竟是11&#xff08;原来是13&#xff0c;猜测为口误&#xff09;&#xff0c;33还是55&#xff0c;或者要不要添加池化层。而Inception网络的作用就是代替你来决定&…

智慧安全:守护智慧城市的安全屏障

随着信息技术的迅猛发展&#xff0c;智慧城市已成为现代城市发展的重要方向。智慧城市通过集成应用先进的信息通信技术&#xff0c;实现城市管理、服务、运行的智能化&#xff0c;为城市的可持续发展注入了新的活力。然而&#xff0c;在智慧城市的建设过程中&#xff0c;安全问…

在windows上安装Jenkins

jenkins安装 下载jenkins 官网&#xff1a;Jenkins download and deployment 官方文档说明&#xff1a;Jenkins User Documentation 安装jenkins1.点击下载好的安装包&#xff0c;点击Next 2.选择一个安装路径 如果系统是windows家庭版打不开策略就创建一个txt文件&#xff0c…

物联网的介绍

物联网&#xff08;Internet of Things&#xff0c;简称IoT&#xff09;是指通过互联网将物理设备、传感器、通信设备和软件系统相互连接&#xff0c;形成一个网络化的系统。它可以实现设备之间的数据交换、信息共享和远程控制&#xff0c;使得物理世界与数字世界紧密结合。 物…

漏洞发现-漏扫项目篇Poc开发Yaml语法反链判断不回显检测Yaml生成

知识点 1、Xray&Afrog-Poc开发-环境配置&编写流程 2、Xray-Poc开发-数据回显&RCE不回显&实验室 3、Afrog-Poc开发-数据回显&RCE不回显&JDNI注入 章节点&#xff1a; 漏洞发现-Web&框架组件&中间件&APP&小程序&系统 扫描项目-综合…

28-5 文件上传漏洞 - 图片马

一、文件内容检测 解析漏洞定义 控制文件是否被当做后端脚本处理 二、图片马绕过 图片马;在图片中包含一句话木马。利用解析漏洞如.htaccess 或文件包含漏洞,对图片马进行解析,执行其中的恶意代码。优势在于可以绕过多种防护机制。 三、图片马制作方法: # 一句话马示例…

数据结构与算法4-冒泡排序

文章目录 1. 认识冒泡排序2. 图示2.1 图示12.2 图示2 3. 代码 1. 认识冒泡排序 双层for循环&#xff0c;每次选出最大的数“浮”到数组的最后面&#xff1b;时间复杂度O( n 2 n^2 n2)&#xff0c;空间复杂度O(1);重复地遍历待排序的数列&#xff0c;一次比较两个元素&#xff…

利用 Claude 3 on Amazon Bedrock 和 Streamlit 的“终极组合”,开发智能对话体验

概述 通过本文&#xff0c;您将学会如何利用 Streamlit 框架快速搭建前端交互界面。该界面将集成图像上传功能&#xff0c;让用户可以方便地提交待处理图片。在后端&#xff0c;我们将借助 Amazon Bedrock 的 Message API&#xff0c;调用 Claude 3 家族中的 Sonnet 模型对图像…

OpenWRT+zeroTier旁路由组网

前言 我之前写过一篇文章&#xff0c;探究了zeroTier的最基础的玩法&#xff0c;那篇文章结尾我提到了使用zeroTier虽然实现组网了&#xff0c;但是我只能访问局域网中制定的设备&#xff0c;局域网中其他设备无法访问&#xff0c;这篇文章我又研究了一套方案openwrtzeroTier旁…

怎么理解面向对象?一文带你全面理解

文章目录 1、类和对象&#xff08;1&#xff09;面向过程和面向对象初步认识&#xff08;2&#xff09;类的引入&#xff08;3&#xff09;类的定义&#xff08;4&#xff09;类的访问限定符及封装4.1 访问限定符4.2 封装 &#xff08;5&#xff09;类的作用域&#xff08;6&am…

Spring 之声明式事务和 Spring Junit 案例应用详解

&#xff08;感谢您的关注和点赞支持&#xff01;&#xff09; Spring-test 在前面测试中&#xff0c;每次从spring 容器中获取 bean 都需要实例化 ApplicationContext &#xff0c;相对麻烦&#xff0c;可以考虑使用 Spring-test 完成测试 Spring Test 是 Spring Framework …

Jackson 2.x 系列【3】解析器 JsonParser

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Jackson 版本 2.17.0 源码地址&#xff1a;https://gitee.com/pearl-organization/study-seata-demo 文章目录 1. 前言2. 解析原理3. 案例演示3.1 创建 JsonParser3.2 解析3.3 读取3.4 测试 1. 前…

水果软件FL Studio 21 for mac 21.2.3.3586破解版的最新版本2024介绍安装

音乐是人类最美好的语言&#xff0c;它能够跨越国界、文化和语言&#xff0c;将人们紧密地联系在一起。在当今数字化时代&#xff0c;音乐创作已经不再是专业人士的专利&#xff0c;越来越多的音乐爱好者开始尝试自己动手制作音乐。而FL Studio21中文版编曲软件正是这样一个为你…

Elasticsearch8搭建及Springboot中集成使用

1.搭建 1.1.下载地址 Elasticsearch&#xff1a;https://www.elastic.co/cn/downloads/elasticsearch Kibana&#xff1a;https://www.elastic.co/cn/downloads/kibana 1.2.具体过程 下载安装包&#xff1a;访问上述链接&#xff0c;下载适合你操作系统的Elasticsearch和Ki…

PyTorch 深度学习(GPT 重译)(五)

十二、通过指标和增强改进训练 本章涵盖 定义和计算精确率、召回率以及真/假阳性/阴性 使用 F1 分数与其他质量指标 平衡和增强数据以减少过拟合 使用 TensorBoard 绘制质量指标图 上一章的结束让我们陷入了困境。虽然我们能够将深度学习项目的机制放置好&#xff0c;但实…

故障诊断 | 一文解决,GRNN广义回归神经网络的故障诊断(Matlab)

文章目录 效果一览文章概述专栏介绍模型描述源码设计参考资料效果一览 文章概述 故障诊断 | 一文解决,GRNN广义回归神经网络的故障诊断(Matlab) 专栏介绍

TinTin Web3 Bounty 挑战杯开启,Sui 向你发出挑战邀请

以下文章来源于TinTinLand &#xff0c;作者TinTinLand。 2024 年开年最火的是什么&#xff1f; 对 Web3 来说&#xff0c;Bounty 任务应该是普通人获得行业“一杯羹”的重要捷径&#xff01; 通过深入学习各类 Web3 技术&#xff0c;凭借实战锻炼开发创新项目&#xff0c;就…