概念

可以理解为升级版的java switch

1 java中的switch -case是一个分支结构,用于匹配整型(byte,short,int,char),字符串,枚举. (long类型不可以)
2. 分支带上break,表示跳出分支结构,没有break会继续向下判断
3. 没有default时,可能一个都匹配不上. 有default时,一定匹配上一个
public static void main(String[] args) {int ch=1;switch (ch){case 1:System.out.println("1");break;case 2:System.out.println("2");break;default:System.out.println("没有匹配上");}

scala没有提供switch case 而是提供了模式匹配的语法

变量名 match{case 值 => 分支语句块
case 其他任何类型 => 分支语句块
case _=> "相当于java的default"
}
不需要break,只会执行其中一条分支

用途

部分替代if else
替代switch等等

用法

匹配字符串

def main(args: Array[String]): Unit = {val name = StdIn.readLine()name match {case "libai" => println(" li bai is a poet")case "john" => println("john is a player")case _=>println("wrong")}}

数组匹配
数组匹配时,会先检查长度,如果长度一致,再坚持每个位置是否匹配
如果是值,检查每个值是否相同
如果是变量,则将值赋值给变量

 def main(args: Array[String]): Unit = {val names=Array(1,2,3,4)names match {case Array()=>println("this is a empty array")case Array(1,2,3)=>println("是三个元素")case Array(3,y,z,m)=>println(3,y)case Array(x,y,z,m)=>println(x,y)case Array(1,2,3,4)=>println("是四个元素")case _=>println("no match")}}

元组匹配
case后的元组的长度必须和要匹配的变量长度一致

  def main(args: Array[String]): Unit = {val t1 = (2, 3, 1, 4)t1 match {case (1, 2, 3, 4) => println("match 1")case (_, _, _, _) => println("match 2")case (2, _, _, _) => println("match 3")}
}

类型匹配
1 类型匹配时,case后的值是类型名,必须带上一个变量名
2 类型的模式匹配可以完全替代isInstanceOf[]

def main(args: Array[String]): Unit = {val a1=Array(1,1.5,Array(1,2),"hello")val ele=a1(Random.nextInt(a1.length))println(ele)ele match {case x:Int=>println("this is Int type "+x)case y:Double=>println("this is double type "+y)case m:Array[Int]=>println("this is Array type "+m)case n:String=>println("this is string type "+n)case _=>println("no match")}}

样例类匹配
连类都可以匹配,这个有点6了.
什么是样例类?

1 是一种特殊的类
2 使用case class修饰
3 会自动提供一个伴生object,object中有apply方法,unapply方法
还会在类中生成copy方法,toString方法,hashCode方法
4可以提供一个main constructor,参数默认为val声明
5样例类是不可变的
6 样例类必须提供参数列表
object _06TemplateClass {def main(args: Array[String]): Unit = {val s1=Student("zhangsan",23,"male")s1 match {case Student("lisi",23,"male")=>println("this is lisi")case Student("zhangsan",23,"male")=>println("this is zhangsan")case Student(x,y,z)=>println(x)case _=>println("no match")}}
}case class Student(name:String,age:Int,gender:String)

unapply方法与apply方法

匹配普通类

apply方法通常会被称为注入方法(创建对象),在类的伴生对象中做以些初始化的操作
apply方法的参数列表不需要和原生类的构造方法参数一致
unapply方法通常被提取方法,使用户unapply方法可以提取固定数量的对象或值
unapply方法返回的是一个Option类型,因为unapply除了提取值之外,还有一个目的就是判断对象是否创建成功
若成功则有值,反之没有值,所有才使用Option做为返回值类型
ps:只要是object类,默认都是提供apply和unapply方法,是被默认隐式调用

匹配Option

object Test extends  App{val x=Option("apple","banana")x match {//只要有值就会执行后面的语句case Some(query) =>println(" it is ok")case None=>}
}

输出结果

 it is ok
object Test extends  App{val x=Option("apple","banana")x match {//query代表的是匹配到的结果的一个变量,随便起的名字case Some(query) =>println(query)case None=>}
}

运行结果

(apple,banana)

匹配的简化写法

总结

一句话,匹配什么都可以!

scala 模式匹配概念及用法示例相关推荐

  1. Scala模式匹配的亮点——Martin Odersky访谈(四)

    Martin Odersky向Bill Venners和Frank Sommers谈论Scala模式匹配的机制和目的. \\ Scala是一种新兴的通用用途.类型安全的Java平台语言,结合了面向对象 ...

  2. 深入理解正则表达式环视的概念与用法

    在<深入理解正则表达式高级教程-环视>中已经对环视做了简单的介绍,但是,可能还有一些读者比较迷惑,今天特意以专题的形式,深入探讨一下正则表达式的环视的概念与用法. 深入理解正则表达式环视的 ...

  3. php this指针的用法,C#_C#中this指针的用法示例,本文实例展示了C#中this指针的 - phpStudy...

    C#中this指针的用法示例 本文实例展示了C#中this指针的用法,对于初学者进一步牢固掌握C#有很大帮助,具体内容如下: 一.this指针是什么: 这里有一些面向对象编程的概念需要说明:类(Cla ...

  4. java正则表达式用法示例_Java正则表达式教程及示例

    java正则表达式用法示例 当我开始使用Java时,正则表达式对我来说是一场噩梦. 本教程旨在帮助您掌握Java正则表达式,并让我定期返回以刷新我的正则表达式学习. 什么是正则表达式? 正则表达式定义 ...

  5. java反射用法示例_Java反射示例教程

    java反射用法示例 Java Reflection provides ability to inspect and modify the runtime behavior of applicatio ...

  6. PHP - 回调函数概念与用法实例分析 - 学习/实践

    1.应用场景 主要用于理解回调函数的概念, 对比JavaScript中的回调函数, 更加深刻理解回调函数的本质, 以及如何高效使用~~~ 2.学习/操作 1. 文档阅读 https://www.jb5 ...

  7. AWK用法示例 awk命令

    AWK:Linux 管理员的智能工具包 作者 Emmett Dulaney AWK 实用工具带有其自己的自包含语言,它不仅是 Linux 中也是任何环境中现有的功能最强大的数据处理引擎之一.这种编程及 ...

  8. C#中DTE的概念和用法

    本文介绍C#中DTE的概念和用法.做VS插件开发,不得不了解DTE,有了DTE我们就可以与VS交互了,比如说获取当前选择的文件,比如说获取当前主窗口,比如说获取编译器等等. 操作流程 1.1. DTE ...

  9. python 匿名函数示例_扣丁学堂Python3开发之匿名函数用法示例详解

    扣丁学堂Python3开发之匿名函数用法示例详解 2018-07-26 14:01:11 1324浏览 今天扣丁学堂Python培训给大家分享关于Python3匿名函数用法,结合实例形式分析了Pyth ...

最新文章

  1. (multi)set的某些操作
  2. 类路径是什么意思_多播是什么意思 多播介绍【详解】
  3. 笔记-高项案例题-2015年上-进度管理-质量管理
  4. 深入浅出时序逻辑电路(1)
  5. promise简单封装ajax 完美嵌套多个ajax请求
  6. linux mint安装步骤,Linux mint 安装步骤
  7. Windows 9信息曝光:统一开发接口、整合Cortana到任务栏
  8. PHP手机壳DIY定制平台源码 Thinkphp内核开发
  9. Node.js webpack webpack-dev-server
  10. 某大型银行深化系统技术方案之十三:服务层之服务接口模式
  11. 2007年IT技术走向何方 网络将再掀“酷”革命
  12. C++ 实现小写金额转化为大写金额
  13. Emacs配置管理框架Cabbage – 介绍
  14. app架构图怎么做,价值2000元的学习资源泄露,实战篇
  15. 转型 细分 新篇章——2018锐捷睿易全国合作伙伴大会
  16. 【嵌入式操作系统-2】Cortex-M7处理器编程者模型
  17. 链上天眼2.0版本上线,欧科云链深耕区块链大数据产业成绩斐然
  18. aardio - 调用Python库下载蓝奏盘文件
  19. Nature:学术造假者瑟瑟发抖,论文图像查重AI技术重拳出击
  20. 无线热点(AP)不稳定之信道的配置优化实践-分析周围信道修改本地使用信道

热门文章

  1. python end用法_8种高级的Python列表使用技巧,都给你整理好啦(附实操代码)
  2. linux 指定jvm djava.library.path_JVM命令
  3. svn回退到上一个版本_Git汇总--对象及版本库存储
  4. Android移动应用基础教程 【程序活动单元Activity】
  5. nodejs 端口被占解决
  6. python 查找excel内容所在的单元格_使用Python查找Excel单元格引用
  7. 2021江西高考成绩6月23日几点查询,2021年江西高考成绩查询时间:6月23日
  8. linux进程map,linux内存优化一文中 查看进程mem_map 的实现
  9. linux 内存 面试,怎么应付面试问了解Linux内存管理吗?
  10. html5历史纪录管理,HTML 5 新增方法以及历史管理