一.基本语法

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

语法

    变量 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. Python import urllib2 ImportError: No module named 'urllib2'

    python3 import urllib2 import urllib2 ImportError: No module named 'urllib2' python3.3里面,用urllib.req ...

  2. Codeforces Round #741 (Div. 2)部分题题解

    我果然还是太菜了,就写了两道题....真是水死了.... A The Miracle and the Sleeper 简化题意:给定\(l,r\),求\(a\)%\(b\)的最大值,其中\(r> ...

  3. Android App隐私合规检测辅助工具(Camille)

    Camille Android App隐私合规检测辅助工具,项目仓库:https://github.com/zhengjim/camille 简介 现如今APP隐私合规十分重要,各监管部门不断开展AP ...

  4. 基于 OSPF 路由的邻居邻接关系发现实践

    1.实验目的 理解 OSPF 邻居关系和 OSPF 邻接关系的含义及差别 观察 OSPF 邻居邻接关系的建立过程 观察 OSPF 链路状态数据库的同步过程 2.实验原理 OSPF 网络中,路由器在发送 ...

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

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

  6. Screenshot 库和Collections 库

    一.screenShot 是 robot framework的标准类库,用于截取当前窗口,需要手动加载. 示例: 运行结果: 二.Collections 库 Collections 库同样为 Robo ...

  7. google浏览器设置检查元素显示框位置

  8. SqlServer新建表操作DDL

    创建新表:1,五要素 2,not null 3,默认值 4,字段注释,表名称 5,索引 6,指定约束名称 -- ------------------------------ Table structu ...

  9. 在dotnet6发布之际,FastNat内网穿透,给开发人员送的硬货福利

    一.FastNat可为您解决的问题 1.没有公网服务器,但是想发布共享本地的站点或网络程序到公网上,以供他人访问: 此项功能大大方面开发人员进行远程调试,微信小程序等开发工作进行. 2.需要远程到在其 ...

  10. Effective C++ 总结笔记(三)

    三.资源管理 13.以对象管理资源 1.为了防止资源泄漏,请使用RAII对象,在构造函数里面获得资源,并在析构函数里面释放资源. 2. 引用计数型智慧指针(RCSP):持续追踪多少个指针指向该资源,无 ...