一.基本语法

在匹配某个范围的数据,需要在模式匹配中增加条件守卫。

语法

    变量 match {
case 匹配条件 => 处理逻辑
case 匹配条件 => 处理逻辑
case 匹配条件 => 处理逻辑
case _ => 其他处理 //case x => 其他条件 如果x不在箭头右边使用,则可以用_代替
}

二.匹配固定值

语法

    变量 match {
case 值1 => ...
case 值2 => ...
case _ => ....
}

三.守卫

语法

    变量 match {
//首先要满足指定类型,然后还要满足后面判断条件,才算匹配上
case x: 类型 if 布尔表达式 =>....
}

示例

    val x = 10
x match {
case i: Int if i >= 0 => i
case j: Int if j < 0 => -j
case _ => "type illegal"
}

四.匹配类型

语法

    变量 match {
case x: 类型1 =>... //如果x不需要在=>右边使用,可以用_代替
case _: 类型2 =>...
case x: 类型3 =>...
}

示例

    line match {
case =>
println(s"string:${line}")
x.length
case x: Int =>
println(s"int:${line}")
x * x
case x: Double =>
println(s"double:${line}")
x * x
case x: Boolean =>
println(s"boolean:${line}")
if (x) 1 else 0
case _ => println("其他类型")
}

五.匹配集合

1.Array

示例

    val arr = Array[Any](1, "hello", 9)
arr match {
//匹配当前数组有4个元素
case Array(x, y, z, e) => println(s"${x} $y $z $e")
//匹配数组以0开头
case Array(0, _*) => println("数组以0开头,元素的个数>=1")
//匹配元素的类型
case Array(x: Int, y: String, z: Int) => println(s"--- ${x} $y $z")
//匹配数组有三个元素,只需要中间一个元素
case Array(_, x, _) => println(s"${x}")
}

2.List

示例

方式一:固定的List匹配

    list match {
//list有多少元素,只有前两个会用到,其余可以用_代替。
case List(x, y, _, _, _, _, _) =>
println(s"list有7个元素,前两个 ${x} ${y}")
//匹配List至少包含两个元素,且第一个元素是Int类型,第二个元素是String
case List(x: Int, _*) =>
println("第一个为Int,第二个为string")
//匹配List的首位元素是固定值,后续的元素不要求
//匹配List至少有一个元素
case List(x, _*) =>
println(s"首位元素是 ${x}")
case _ => println("其他情况")
}

方式二:::方式

    list match {
//只有三个元素
case x :: y :: z :: Nil => println("当前List有三个元素")
//x是第一个元素,tail是剩余元素组成的List
case x :: tail => println(s"匹配首位元素 ${x} 剩余部分:${tail}")
//前两个元素Int类型x、Int类型,tail是其余元素组成的List
case (x: Int) :: (y: Int) :: tail => println("匹配list至少两个元素,第一个为int,第二个int")
case _ => println("+++++++++++++++++")
}

泛型擦除

如果在匹配类型的时候,List中的泛型在运行的时候会擦除,导致 x:List[String] x:List[Int]的匹配效果一样

示例

    val arr = List[Int](1, "hello", false, 10.0, 2)
arr match {
case x: List[String] => println("....")
case x: List[Int] => println("++++++")
}
//以上会匹配到第一个条件.

3.元祖

示例

    val t1: (Any, Any, Any) = ("zhangsan", 20, "shenzhen")
t1 match {
//匹配元组的元素,在匹配的时候元组的长度要和变量的元组长度要一致
case (name: String, age: Int, address: String) =>
println("name string,age int,address string") //要想匹配元组元素的类型,变量中数据的类型必须设置为Any
case (name: Int, age: String, address: String) =>
println("name int,age string,address string")
case (name, age, address) => println(s"${name} ${age} ${address}")
}

4.对象和样例类

1.样例类

定义语法:case class 类名([val/var] 属性名:类型,...)

​ 属性默认就是val修饰的

​ 直接用于模式匹配

创建样例类对象:case_class_类名(值,..)

示例

    //样例类
case class Person(name: String, age: Int) val person: Any = Person("zhangsan", 20)
//对象匹配
person match {
case Person(name, age) => println(s"name=${name} age=${age}")
}

2.普通类

如果想要让普通的class能够用于模式匹配。需要在伴生对象中创建unapply方法

    //普通类AA
class AA(val name: String, val age: Int)
object AA {
def apply(name: String, age: Int) = new AA(name, age)
//unapply如果返回的Some,代表能够匹配上,如果返回的是None,代表不能匹配上
def unapply(arg: AA): Option[(String, Int)] = Some(arg.name, arg.age)
}

六.偏函数

定义: 没有match关键字的模式匹配

语法

    val 函数名: PartialFunction[A, B] = {
case...
case...
}
//A: 入参的类型
//B:返回值的类型

应用场景

    val list = List[(String, (String, (String, Int)))](
("A", ("1001", ("zhangsan", 20))),
("A", ("1002", ("lisi", 20))),
("A", ("1003", ("wangwu", 20))),
)
list.map({
case (schoolName, (className, (studentName, age))) => age
})

七.赋值匹配

示例

    val (name,age) = ("zhangsan",20)
val List(x,y,z,_*) = List(1,2,3,4,5,6,7)

八.for循环匹配

示例

    val map = Map[String,Int](...)
for( (K,V) <- map) {
...
}

Scala(六)【模式匹配】的更多相关文章

  1. 【scala】模式匹配

    Scala的模式匹配是通过match表达式从若干可选项中选择,类似Java中的switch. 例子: val firstArg = if(args.length>0) args(0) else ...

  2. Scala之模式匹配(Patterns Matching)

    前言 首先.我们要在一開始强调一件非常重要的事:Scala的模式匹配发生在但绝不仅限于发生在match case语句块中.这是Scala模式匹配之所以重要且实用的一个关键因素!我们会在文章的后半部分具 ...

  3. 聊聊 scala 的模式匹配

    一. scala 模式匹配(pattern matching) pattern matching 可以说是 scala 中十分强大的一个语言特性,当然这不是 scala 独有的,但这不妨碍它成为 sc ...

  4. scala 常用模式匹配类型

    模式匹配的类型 包括: 常量模式 变量模式 构造器模式 序列模式 元组模式 变量绑定模式等. 常量模式匹配 常量模式匹配,就是在模式匹配中匹配常量 objectConstantPattern{ def ...

  5. Scala学习——模式匹配

    scala模式匹配 1.基础match case(类似java里switch case,但功能强大些) object MatchApp { def main(args: Array[String]): ...

  6. Scala的模式匹配

    1.概述 2.程序示例(普通的示例) 3.模式匹配(Array) 4.程序示例(Array) 5.模式匹配(List) 6.程序示例 7.遍历 8.模式匹配(case class) 9.程序示例(传统 ...

  7. Scala入门系列(十一):模式匹配

    引言 模式匹配是Scala中非常有特色,非常强大的一种功能. 类似于Java中的switch case语法,但是模式匹配的功能要比它强大得多,switch只能对值进行匹配,但是Scala的模式匹配除了 ...

  8. Scala - 快速学习07 - 模式匹配

    Scala中的模式匹配的功能可以应用到switch语句.类型检查.“解构”等多种场合. 简单匹配 Scala的模式匹配最常用于match语句中.Scala的match语句类似Java里的switch. ...

  9. Scala学习教程笔记三之函数式编程、集合操作、模式匹配、类型参数、隐式转换、Actor、

    1:Scala和Java的对比: 1.1:Scala中的函数是Java中完全没有的概念.因为Java是完全面向对象的编程语言,没有任何面向过程编程语言的特性,因此Java中的一等公民是类和对象,而且只 ...

随机推荐

  1. linux 虚拟网络设备的使用

    1. linux 常见虚拟网络设备分类 常见虚拟网络设备有:bridge, tun/tap, veth-pairs, macvlan, macvtap等.有一篇博文写的挺好的,图文并茂:虚拟网络设备, ...

  2. 基于 Istio 的全链路灰度方案探索和实践

    作者|曾宇星(宇曾) 审核&校对:曾宇星(宇曾) 编辑&排版:雯燕 背景 微服务软件架构下,业务新功能上线前搭建完整的一套测试系统进行验证是相当费人费时的事,随着所拆分出微服务数量的不 ...

  3. uni-app视频组件设置圆角

    无法实现,建议写个image在中间位置加个播放按钮,点击播放跳转新页面只需要在跳转参数里面把视频链接加上,在onLoad里面获取视频链接,自动播放视频,很多app目前都是这样做的,关闭页面后视频会自动 ...

  4. yum设置取消代理

    unset http_proxy unset https_proxy 暂时取消代理,若永久取消代理,需要修改/etc/yum.conf 去掉 proxy=http://proxyhost:8080

  5. Windows应用开发中程序窗口中的各种图标尺寸规划

    为了让你的图标在各个视图模式下都能有合适的尺寸,需要制作4种尺寸16x16.32x32.48x48.256x256 在Windows系统中,几乎所有窗口都是ListView,其中的图标都按照指定的尺寸 ...

  6. SpringCloud微服务实战——搭建企业级开发框架(十九):Gateway使用knife4j聚合微服务文档

      本章介绍Spring Cloud Gateway网关如何集成knife4j,通过网关聚合所有的Swagger微服务文档 1.gitegg-gateway中引入knife4j依赖,如果没有后端代码编 ...

  7. MySQl安装图形界面

    对于mysql的图形界面有很多个:1.MySQL GUI Tools MySQL GUI Tools是一个可视化界面的MySQL数据库管理控制台,提供了四个非常好用的图形化应用程序,方便数据库管理和数 ...

  8. [cf1495F]Squares

    令$nex_{i}=\min_{i<j,p_{i}<p_{j}}j$(即$i$的第2类边),若不存在此类$j$则$nex_{i}=n+1$ 建一棵树,其以0为根,且$1\le i\le n ...

  9. [gym101981F]Frank

    在本题中,每一步是独立的,因此即可以看作从$s$移动到$t$的期望步数(对于每一对$s$和$t$都求出答案) 令$f_{i,j}$表示当$s=i$且$t=j$时的答案,则有$f_{i,j}=\begi ...

  10. [loj3367]装饼干

    先考虑如何判定一个$y$是否可行--从高位开始,记录这一位所需要的$2^{i}$数量$t$,若$y$的这一位为1,则$t+=x$,之后分两类讨论:1.$t\le a_{i}$,令$t=0$:2.$b& ...