Scala 模式匹配

news2024/10/6 6:42:07

文章目录

  • Scala 模式匹配
    • 一、模式匹配
      • 1、基本语法
      • 2、语法说明
      • 3、案例示例
    • 二、模式守卫
    • 三、模式匹配类型
      • 1、匹配常量
      • 2、匹配类型
      • 3、匹配数组

Scala 模式匹配

一、模式匹配

Scala 中的模式匹配类似于Java中的switch语法,但是scala 从语法中补充了更多的功能,所以更加强大

1、基本语法

模式匹配语法中,采用match关键字声明,每个分支采用case关键字进行声明,当需要匹配时,会从第一个case分支开始,如果匹配成功,那么执行相对应的逻辑代码,如果匹配不成功,继续执行下一个分支进行判断。如果所有的case都不匹配,那么会执行case…分支,类似于Java中的default语句

2、语法说明

(1) 如果所有case都不匹配,那么会执行case_分支,类似于Java中的default语句,若此时没有case_分支,那么会抛出 MatchError
(2) 每个case中,不需要使用break 语句,自动中断case
(3) match case 语句可以匹配任何类型,而不是字面量
(4) => 后面的代码块,直到下一个case 语句之前的代码是作为一个整体执行,可以使用{}括起来,也可以不括

3、案例示例

package Scala04_moshipipei
//模式匹配基本语法
class test01_moshi {

}
object test01_moshi{
  def main(args: Array[String]): Unit = {
    //1、基本语法定义
    val x:Int = 10
    val y:String = x match {
      case 1 => "one" //如果为1那么返回的是one,中间是=> 连接
      case 2 => "two"
      case 3 => "there"
      case _ => "这就是默认情况了,0"
    }//判断x等于什么,如果x为1那么y就是one,如果x为2那么y就是two
    println(y)

    //2、示例;用模式匹配实现简单的二元运算
    val a = 25
    val b = 13
    def hanshu(op:Char) = op match {
      case '+' => a + b
      case '-' => a - b
      case '*' => a * b
      case '/' => a / b
      case '%' => a % b
      case _ => "非法运算符"

    }
    println(hanshu('*'))
    println(hanshu('+'))
    println("\\") //传一个字符进去,还要进行转义


  }
}

二、模式守卫

如果想要表达匹配某个范围的数据,就需要在模式匹配中增加条件守卫
注意num 就是 那个 i,然后调用的时候传入参数进去就可以了

// 模式守卫
    //求一个整数的绝对值
    def fanfga(num:Int) = num match { //num就是下面的那个i
      case i if i >= 0 => i //定义一个i,如果i大于等于0就返回i
      case i if i < 0 => -i //如果小于0 那么输出-i,那肯定就是绝对值

    }
    println(fanfga(5))
    println(fanfga(0))
    println(fanfga(-5))

在这里插入图片描述

三、模式匹配类型

Scala 中,模式匹配可以匹配所有的字面量,包括字符串,字符,数字,布尔值等等。
推荐还是把 case _ 加上,因为写的条件可能就那么几个,要是写错了,就会报 MatchError

1、匹配常量

 //Scala 中,模式匹配可以匹配所有的字面量,包括字符串,字符,数字,布尔值等等。
    //1、匹配常量
    def hanshu(x:Any):String = x match { //返回值不一定非得String,其他的也可以
      case 1 => "num one" //这就是返回值
      case "hello scala" => "String hello"
      case true => "Boolen true" //连布尔类型都可以
      case '+' => "Char +"
      case _ => ""  //建议还是要设置一个这个,然后条件是有限的,传入参数要是没有就报错了
    }
    println(hanshu(1))
    println(hanshu("hello scala"))
    println(hanshu(true))
    println(hanshu(0.3))

在这里插入图片描述

2、匹配类型

Scala 不仅仅可以匹配常量,还可以匹配数据结构,比如列表,数组.
注意:类型匹配的时候要注意,比如定义了List[String]泛型,规定的定义的是String类型的,但是Int类型的还是匹配上了,因为Scala 的底层有泛型擦除,他只会匹配到是一个list,泛型会自动擦除。而数组比较特殊,它是没有泛型擦除的,所以特别注意这两个地方,容易出现Bug

package Scala04_moshipipei
//模式匹配类型
class test02_pipeileixing {

}
object test02_pipeileixing{
  def main(args: Array[String]): Unit = {
    //Scala 中,模式匹配可以匹配所有的字面量,包括字符串,字符,数字,布尔值等等。
    //1、匹配常量
    def hanshu(x:Any):String = x match { //返回值不一定非得String,其他的也可以
      case 1 => "num one" //这就是返回值
      case "hello scala" => "String hello"
      case true => "Boolen true" //连布尔类型都可以
      case '+' => "Char +"
      case _ => ""  //建议还是要设置一个这个,然后条件是有限的,传入参数要是没有就报错了
    }
    println(hanshu(1))
    println(hanshu("hello scala"))
    println(hanshu(true))
    println(hanshu(0.3))

    println("================")
    //2、匹配类型
    def hanshu2(x:Any):String = x match {
      case i:Int => "int" + i //相当于前面规定了这个变量必须的是Int类型的才能匹配上
      case i:String => "String," + i
      case list: List[String] => "list:" + list //连List类型都可以定义
      case array:Array[Int] => "现在是第"+array.mkString(",")+"圈" //因为数组直接输出是引用,所以要用mkString方法输出
      case a => "Something else:" + a //这是兜底的方法,要拿到值的话就不能用 _ ,必要要设置一个变量
    }
    println(hanshu2(35))
    println(hanshu2("hello"))
    println(hanshu2(List("hi","hello")))
    println(hanshu2(List(2,23)))
    println(hanshu2(Array("hi","hello")))
    println(hanshu2(Array(2,23)))
  }
}

在这里插入图片描述

3、匹配数组

Scala 模式匹配,匹配数组非常强大,可以进行各种模糊的匹配,比如可以匹配必须是三个元素,或者中为1的三个元素的数组。

   //3、匹配数组
    for (arr <- List(
      Array(0),
      Array(1,0),
      Array(0,1,0),
      Array(1,1,0),
      Array(2,3,7,15),
      Array("hello",20,30)
    )){
     val result = arr match {
       case Array(0) => "0"
       case Array(1,0) => "1,0"
       case Array(x,y) => "Array:" + x + y //相当于可以进行模糊查询,匹配两元素数组
       case Array(0,_*) => "以0开头的数组"
       case Array(x,1,z) => "中间为1的三元素数组"
       case _ => "兜底的方法"
     }
      println(result)
    }

在这里插入图片描述

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

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

相关文章

Optional更优雅的判空

我们在日常的开发工作最经常碰到的异常就是空指针异常&#xff0c;排查起来非常麻烦影响开发效率。如果想避免这种问题&#xff0c;就要写大量的if(xx ! null){}这样的冗余代码&#xff0c;把自己的逻辑写入到括号内部&#xff0c;这样的代码看起来臃肿繁琐。JDK8中为我们提供了…

IP 分支组网解决方案

IP 分支机构组网解决方案在总部部署高性能设备作为中心网关&#xff0c;在各地分支机构分别部署一台产品作为分支机构接入网关&#xff0c;与总部网关进行加密的连接。融合多种产品特性&#xff0c;可有效、快速、安全的实现分支机构的远程接入。同时&#xff0c;采用集中管控平…

对象,类与面向对象编程 上

目录 前言 理解对象 属性的类型 数据属性【Data Properties】 访问器属性【Accessor Properties】 合并对象 对象标识及相等判定 增强的对象语法 1. 属性值简写 2.可计算属性 3.简写方法名 4.对象解构 5.嵌套解构 创建对象 工厂模式 构造函数模式 原型模式 原型…

【敲敲云】零代码平台快速入门指南—上篇

本文通过快速搭建一个《客户管理》应用&#xff0c;帮您快速掌握搭建敲敲云应用的基本思路和操作。 一、敲敲云简介 敲敲云是一个APaaS平台,零代码的应用搭建平台,无需编程简单易学,可以帮助业务人员在不写代码的情况下搭建个性化的CRM、ERP、OA等。敲敲云支持自动化工作流还可…

GIOU 附图说明

在目标检测中&#xff0c;常用IOU评价检测框和ground truth框的相似程度&#xff0c; IOU intersection / union. IOU的取值范围是[0,1]. 但是看下面这两种情况&#xff0c;两个目标框的距离是不一样的&#xff0c;这时它们的IOU都是0&#xff0c;反映不出来。 这时就可以用到…

【JavaGuide面试总结】Linux篇

【JavaGuide面试总结】Linux篇1.介绍一下inode2.说一下Linux系统的目录结构3.说一下Linux系统的文件类型1.介绍一下inode 硬盘的最小存储单位是扇区(Sector)&#xff0c;块(block)由多个扇区组成。文件数据存储在块中。块的最常见的大小是 4kb&#xff0c;约为 8 个连续的扇区…

Linux系统编程——共享内存映射(进程间通信)

目录mmap函数1.函数原型2.建立映射区3.注意事项4.父子进程间mmap通信4.无血缘关系进程间mmap通信写进程&#xff1a;读进程&#xff1a;附&#xff1a;文件用于进程间通信mmap函数 1.函数原型 void *mmap(void *addr&#xff0c;size_t length, int prot,int flags&#xff0…

代码随想录训练营第五十六天

1.两个字符串的删除操作 题583 ①dp数组含义 由于有两个数组比较&#xff0c;所以用二维数组dp。dp[i] [j]表示以i-1为结尾的word1和以j-1为结尾的word2达到相等需要删除的元素的个数。 ②递推公式 两种情况&#xff0c;当word[i-1] word2[j-1]时&#xff0c;有没有i-1为结…

【Linux】gcc编译器的使用(程序的翻译过程)

目  录1 程序的翻译1.1预处理&#xff08;进行宏替换&#xff09;1.2 编译&#xff08;生成汇编代码&#xff09;1.3 汇编&#xff08;生成机器可识别代码&#xff09;1.4 链接&#xff08;生成可执行文件或者库文件&#xff09;1.5 gcc常用选项总结程序的翻译过程包括&#…

Diffie-Hellman密钥协商算法探究

作者 | 魔王赵二狗 导读 隐私计算&#xff08;Privacy-preserving computation&#xff09;是指在保证数据提供方不泄露原始数据的前提下&#xff0c;对数据进行分析计算的一系列信息技术&#xff0c;保障数据在流通与融合过程中的可用不可见。而Diffie–Hellman密钥协商是一种…

2023-01-10 mysql列存储引擎-聚合多线程并行扫表-VCPackGuardian策略LOCK_ALL-概要设计

摘要: 当前的pack淘汰策略为LOCK_ONE, 在多线程切换时导致pack地址丢失。 新设计LOCK_ALL策略以保证多线程聚合正常工作。 设计思想: 多线程聚合运算期间, 对持有的pack不做淘汰业务中对pack的读取和释放保持原有逻辑架构设计: 静态结构: 动态结构: 上层业务通过VirtualCol…

【学习笔记之Linux】工具之vim基本介绍

vim基本认识 vim是一种多模式的编辑器&#xff0c;它是vi的升级版本&#xff0c;它兼容vi所有的指令并加入了一些新的特性在里面。vi是一个老式的文本编辑器&#xff0c;功能相当齐全&#xff0c;vim则是在vi之上更进了一步&#xff0c;拥有代码补全、编译及错误跳转等功能&…

pytorch OutOfMemoryError

torch.cuda.OutOfMemoryError before: self.memory deque(maxlen50000) after: self.memory deque(maxlen500) ok.... pytorch模型提示超出内存cuda runtime error(2): out of memory - pytorch中文网 看到这个提示&#xff0c;表示您的GPU内存不足。由于我们经常在PyTo…

做外贸有没有好的软件?

在外贸电商行业中&#xff0c;邮件营销是非常重要的一种营销方式之一。除了性价比高&#xff0c;他还能对目标客户进行精准营销。但是&#xff0c;对于刚开始做的公司来讲&#xff0c;不注意方法和细节也难收获到理想的营销效果。 一、问题 1&#xff09;不管理邮箱联系人 只…

13.Isaac教程--模型制作

模型制作 ISAAC教程合集地址: https://blog.csdn.net/kunhe0512/category_12163211.html 该软件包演示了具有软件定义装配工作流程的工厂场景。 在模拟工厂环境中&#xff0c;多个 AMR 在装配站之间运输材料&#xff0c;而每个装配站的机械臂拾取所需材料并将其放置在对接的 …

自定义el-pagination分页

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; vue项目使用el-ui库&#xff0c;由于原本的el-pagination显示字段和样式无法满足其他项目的设计要求&#xff0c;需要进行改动 el-ui官网&#xff1a; 改动后&#xff1a; 解决方案&#xff1a; 1…

golang字符串常见功能

文章目录1. 获取字符串长度2. 是否一xx开头3. 是否以xx结尾4. 是否包含5. 变大写6. 变小写7. 去两边8. 替换9. 分割10. 拼接11. string转换为int12. int转换为string13. 字符串和字节切片14. 字符串和rune切片15. string和字符1. 获取字符串长度 2. 是否一xx开头 3. 是否以xx结…

抖音seo优化排名

武汉微驱动科技有限公司 你有没有想过&#xff0c;同样是运营抖音&#xff0c;为什么别人的视频总是排在你的前面&#xff1f;你死磕创意&#xff0c;拍摄、剪辑&#xff0c;甚至比同行更投入&#xff0c;为什么他的收益总是高于你&#xff1f; 当下抖音搜索引擎的用户数量已经…

Nginx与LUA(1)

您好&#xff0c;我是湘王&#xff0c;这是我的CSDN博客&#xff0c;欢迎您来&#xff0c;欢迎您再来&#xff5e;HTTP服务器是相对于HTTP客户端来说的——HTTP客户端就是各种常用的「浏览器」&#xff0c;如IE、chrome、微信浏览器。当浏览器通过URL地址栏访问一个Web页面时&a…

【C++】STL六大组件之一——适配器(adapters)

目录1. 前言2. 初始适配器2.1 适配器的概念2.2 适配器的分类3. 容器适配器&#xff08;container adapters&#xff09;3.1 认识deque3.1.1 逻辑结构3.1.2 物理结构3.1.3 deque的迭代器3.1.4 选择deque做stack/queue底层容器的原因3.2 stack3.3 queue3.4 另一种容器适配器 ——…