scala学习笔记08-模式匹配:match
程序员文章站
2022-06-14 17:16:25
...
模式匹配:match
- Scala 中的模式匹配类似于Java 中的switch 语法,但是更加强大
- scala中有match类似于java中的switch语句,模式匹配包含了一系列备选项,每个都开始于关键字 case ;每个备选项都包含了一个模式及一到多个表达式;箭头符号 => 隔开了模式和表达式。
- match 表达式通过以代码编写的先后次序尝试每个模式来完成计算,只要发现有一个匹配的case,剩下的case不会继续匹配。
注意:
- 如果所有case 都不匹配,那么会执行case _ 分支,类似于Java 中default 语句
- 如果所有case 都不匹配,又没有写case _ 分支,那么会抛出MatchError
- 每个case 中,不用break 语句,自动中断case
- 可以在match 中使用其它类型,而不仅仅是字符
- => 等价于java swtich 的 “ : ”
- => 后面的代码块到下一个case, 是作为一个整体执行,可以使用{} 扩起来,也可以不扩。
/**
1. match (类似java switch) 和case 是关键字
2. 如果匹配成功, 则执行=> 后面的代码块.
3. 匹配的顺序是从上到下,匹配到一个就执行对应的代码
4. => 后面的代码块不要写break ,会自动的退出match
5. 如果一个都没有匹配到,则执行case _ 后面的代码块
*/
def listPlus2(n:Any) : Any ={
n match {
case x:Int => x + 2 //如果x为iint类型的,则返回x+2
case _ => println("无法匹配")
}
简单应用match
object Match01 {
def main(args: Array[String]): Unit = {
//java中有switch表示另一种分支
/**
* 什么时候选择if.else或者switch
* 在java中如果分支条件全是选项的时候,判断的数量大于3时使用switch
* 但是在scala中,使用模式匹配的方式,scala中的模式匹配比java中的switch强大,因为在java中switch的条件是有限的
*/
var profession = 8
profession match {
case 1 => println("警察")
case 2 => println("医生")
case 3 => println("教师")
case 4 => println("司机")
case _ => println("暂无此岗位") //当上面的case都没有匹配上,就执行这行语句,类似于java switch中的default
}
}
}
模式匹配中的守卫操作
//模式匹配中的守卫操作
object Match02_shouwei {
def main(args: Array[String]): Unit = {
var n = 50
var t = "请假"
//使用守卫操作,对同一个值进行不同条件的判断匹配
//60一下为不合格,如果做够50而且有请假的话为合格
n match {
case 40 => println("不合格")
case 50 if t.eq("请假") => println("合格") //守卫操作
case 60 => println("合格")
case 90 => println("良好")
case 100 => println("优秀")
}
}
}
模式匹配:匹配数组&列表
//模式匹配:匹配数组&列表
object Match03_Array_LIst {
def main(args: Array[String]): Unit = {
//匹配数组
// var arr01 = Array[String]("苹果","香蕉","桃子","葡萄","梨")
var arr01 = Array[String]("葡萄","梨")
arr01 match {
case Array("香蕉") => println("arr01中只有香蕉") //当arr01中只有香蕉时才能匹配上
case Array("香蕉",_*) => println("arr01是以香蕉开头的") //当arr01中以有香蕉开头时才能匹配上
case Array("苹果",_*) => println("arr01是以苹果开头的") //当arr01中以苹果开头时才能匹配上
case Array(a) => println("arr01有一个元素") //当arr01中有1个元素时,可以匹配
case Array(a,b) => println("arr01有两个元素") //当arr01中有2个元素时,可以匹配
case Array(a,b,c) => println("arr01有三个元素") //当arr01中有3个元素时,可以匹配,超过3个就不行了
case _ => println("arr01没有匹配值")
}
println("-------匹配列表---------")
//匹配列表
// var list01 = List("苹果","香蕉","桃子","葡萄","梨")
var list01 = List("梨","香蕉")
// var list01 = List("梨")
list01 match {
// case List("梨") => println("list01中只有梨")
case "梨"::Nil => println("list01中只有梨") //list最后一个元素必须加上::Nil
// case List("苹果",_*) => println("list01以苹果开头")
// "苹果"::tail == 苹果, 香蕉, 桃子, 葡萄, 梨
case "苹果"::tail => println("list01以苹果开头")
//匹配数量
case a::Nil => println("list01中有1个元素") //当list01中有1个元素时可以匹配
case a::b::Nil => println("list01中有2个元素") //当list01中有2个元素时可以匹配
case a::b::c::Nil => println("list01中有3个元素") //当list01中有3个元素时可以匹配,最多匹配3个元素
case _ => println("list01没有匹配值")
}
// println(list01.tail) //List(香蕉, 桃子, 葡萄, 梨)
}
}
上一篇: 使用python中的in ,not in来检查元素是不是在列表中的方法
下一篇: 反射获取构造方法