一.基本语法

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

语法

    变量 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. jvm优化理解

    jvm架构理解 jvm程序执行流程 编译器和解释器协调工作流程 在部分商用虚拟机中(如HotSpot),java程序最初是通过解释器进行解释执行的,当虚拟机发现某个方法或者某段代码执行的特别频繁后就会 ...

  2. 如何系统学习C 语言(中)之 结构体篇

    1,结构体 在前面我们知道变量和数组都可以用来存储数据,变量用来存储单个数据,数组可以用来存储一组同类型的数据,但你有没有发现--它们都只适合单一属性的数据.那现实生活中,很多对象都是具有多属性的.例 ...

  3. C# 两个具有相同属性的类赋值

    最近有遇到两个类之间的赋值问题,两个类的属性几乎都一样的,所以写了个通过反射获取属性的然后赋值的方法,把一个类的属性的值赋值给另一个类. 框架是.net 4.5 public static D Map ...

  4. Java学习(十二)

    今天安装讲师推荐下载了一个叫Hbuiler X的IDE,并且学习了选择器的知识. 作为练习,写了一下的代码 <!DOCTYPE html> <html> <head> ...

  5. vue+node+mongondb实战之mongodb登陆操作

    页面搭建基本完成,只是样式还没有美化,由于采取的前后端分离开发,所有页面逻辑全部由vue来负责,后台采用express框架只用来提供 接口,注册就是讲数据存入数据库,比较简单,而登陆碰了一些小问题,发 ...

  6. [hdu6595]Everything Is Generated In Equal Probability

    计算一对逆序对的贡献,即在n个数期望要删多少步才能删掉其中的两个数,设f(n)表示此时的期望,则有方程$f[n]=3/4+(\sum_{i=2}^{n}f[i]\cdot c(n-2,i-2))/2^ ...

  7. [loj3052]春节十二响

    首先可以发现对于两条链来说,显然是对两边都排好序,然后大的配大的,小的配小的(正确性比较显然),最后再加入根(根只能单独选)这个结果其实也可以理解为将所有max构成一条新的链,求出因此,对于每一个结点 ...

  8. 2021年春秋杯网络安全联赛秋季赛 勇者山峰部分wp

    1.签到题-Crypto Vigenere 根据题目Vigenere可看出是维吉尼亚密码 使用在线网站破解 https://guballa.de/vigenere-solver flag:53d613 ...

  9. NLP获取词向量的方法(Glove、n-gram、word2vec、fastText、ELMo 对比分析)

    自然语言处理的第一步就是获取词向量,获取词向量的方法总体可以分为两种两种,一个是基于统计方法的,一种是基于语言模型的. 1 Glove - 基于统计方法 Glove是一个典型的基于统计的获取词向量的方 ...

  10. postman自动调用获取token

    Postman不光支持单次请求,还支持环境变量.全局变量.集合变量 本文使用Collection Variable Collection 如下图可以点击Collection然后可以添加请求和文件夹,以 ...