Scala(六)【模式匹配】
一.基本语法
在匹配某个范围的数据,需要在模式匹配中增加条件守卫。
语法
变量 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(六)【模式匹配】的更多相关文章
- 【scala】模式匹配
Scala的模式匹配是通过match表达式从若干可选项中选择,类似Java中的switch. 例子: val firstArg = if(args.length>0) args(0) else ...
- Scala之模式匹配(Patterns Matching)
前言 首先.我们要在一開始强调一件非常重要的事:Scala的模式匹配发生在但绝不仅限于发生在match case语句块中.这是Scala模式匹配之所以重要且实用的一个关键因素!我们会在文章的后半部分具 ...
- 聊聊 scala 的模式匹配
一. scala 模式匹配(pattern matching) pattern matching 可以说是 scala 中十分强大的一个语言特性,当然这不是 scala 独有的,但这不妨碍它成为 sc ...
- scala 常用模式匹配类型
模式匹配的类型 包括: 常量模式 变量模式 构造器模式 序列模式 元组模式 变量绑定模式等. 常量模式匹配 常量模式匹配,就是在模式匹配中匹配常量 objectConstantPattern{ def ...
- Scala学习——模式匹配
scala模式匹配 1.基础match case(类似java里switch case,但功能强大些) object MatchApp { def main(args: Array[String]): ...
- Scala的模式匹配
1.概述 2.程序示例(普通的示例) 3.模式匹配(Array) 4.程序示例(Array) 5.模式匹配(List) 6.程序示例 7.遍历 8.模式匹配(case class) 9.程序示例(传统 ...
- Scala入门系列(十一):模式匹配
引言 模式匹配是Scala中非常有特色,非常强大的一种功能. 类似于Java中的switch case语法,但是模式匹配的功能要比它强大得多,switch只能对值进行匹配,但是Scala的模式匹配除了 ...
- Scala - 快速学习07 - 模式匹配
Scala中的模式匹配的功能可以应用到switch语句.类型检查.“解构”等多种场合. 简单匹配 Scala的模式匹配最常用于match语句中.Scala的match语句类似Java里的switch. ...
- Scala学习教程笔记三之函数式编程、集合操作、模式匹配、类型参数、隐式转换、Actor、
1:Scala和Java的对比: 1.1:Scala中的函数是Java中完全没有的概念.因为Java是完全面向对象的编程语言,没有任何面向过程编程语言的特性,因此Java中的一等公民是类和对象,而且只 ...
随机推荐
- Python import urllib2 ImportError: No module named 'urllib2'
python3 import urllib2 import urllib2 ImportError: No module named 'urllib2' python3.3里面,用urllib.req ...
- Codeforces Round #741 (Div. 2)部分题题解
我果然还是太菜了,就写了两道题....真是水死了.... A The Miracle and the Sleeper 简化题意:给定\(l,r\),求\(a\)%\(b\)的最大值,其中\(r> ...
- Android App隐私合规检测辅助工具(Camille)
Camille Android App隐私合规检测辅助工具,项目仓库:https://github.com/zhengjim/camille 简介 现如今APP隐私合规十分重要,各监管部门不断开展AP ...
- 基于 OSPF 路由的邻居邻接关系发现实践
1.实验目的 理解 OSPF 邻居关系和 OSPF 邻接关系的含义及差别 观察 OSPF 邻居邻接关系的建立过程 观察 OSPF 链路状态数据库的同步过程 2.实验原理 OSPF 网络中,路由器在发送 ...
- linux 虚拟网络设备的使用
1. linux 常见虚拟网络设备分类 常见虚拟网络设备有:bridge, tun/tap, veth-pairs, macvlan, macvtap等.有一篇博文写的挺好的,图文并茂:虚拟网络设备, ...
- Screenshot 库和Collections 库
一.screenShot 是 robot framework的标准类库,用于截取当前窗口,需要手动加载. 示例: 运行结果: 二.Collections 库 Collections 库同样为 Robo ...
- google浏览器设置检查元素显示框位置
- SqlServer新建表操作DDL
创建新表:1,五要素 2,not null 3,默认值 4,字段注释,表名称 5,索引 6,指定约束名称 -- ------------------------------ Table structu ...
- 在dotnet6发布之际,FastNat内网穿透,给开发人员送的硬货福利
一.FastNat可为您解决的问题 1.没有公网服务器,但是想发布共享本地的站点或网络程序到公网上,以供他人访问: 此项功能大大方面开发人员进行远程调试,微信小程序等开发工作进行. 2.需要远程到在其 ...
- Effective C++ 总结笔记(三)
三.资源管理 13.以对象管理资源 1.为了防止资源泄漏,请使用RAII对象,在构造函数里面获得资源,并在析构函数里面释放资源. 2. 引用计数型智慧指针(RCSP):持续追踪多少个指针指向该资源,无 ...