模式匹配
1.case 基本用法,对变量的值进行模式匹配
变量 match {
case 值1 => 代码段1
case 值2 => 代码段2
case _ => 代码段3 不满足值1和值2 到_分支下
}
def score(score:String) {
score match {
case "A" => println("优秀!")
case "B" => println("一般")
case "C" => println("及格")
case _ => println("渣渣") 默认的情况要放在最后一个分支
}
}
2.在模式匹配可以添加if守卫
通过if守卫可以进一步的筛选,针对默认条件进一步筛选。
def score(score:String, name:String) {
score match {
case "A" => println("优秀!")
case "B" => println("一般")
case "C" => println("及格")
case a if name == "wxz" => println("分数:" + a + "不用考试")
case a => println("分数:" + a + "渣渣")
}
}
或者
def score(score:String, name:String) {
score match {
case "A" => println("优秀!")
case "B" => println("一般")
case "C" => println("及格")
case _ if name == "wxz" => println("分数:" + name + "不用考试")
case _ => println("分数:" + name + "渣渣")
}
}
score("D","WANG")
3.模式匹配不仅仅可以匹配值, 可以匹配类型,类型和值 混合匹配。
如果匹配类型,需要给case 条件起一个别名
def caseType(arg:Any) {
arg match {
case e1:Long => println("Long类型:" + e1)
case e2:String => println("String:" + e2)
case _ => println("其他的类型")
}
}
模式匹配,值和类型混合使用,进入匹配语句。从上到下,执行满足的第一条语句。
注意:混合匹配 范围 从小到大范围。否则会产生死区代码
def caseMix(arg:Any) {
arg match {
case 1 => println("值匹配 1")
case "two" => println("值匹配 two")
case e1:Int => println("类型匹配 Int")
case e2 => println("其他值或者类型")
}
}
死区代码:逻辑错误,有些语句一直无法执行到
def caseMix(arg:Any) {
arg match {
case e1:Int => println("类型匹配 Int")
case 1 => println("值匹配 1") //死区代码
case "two" => println("值匹配 two")
case e2 => println("其他值或者类型")
}
}
4.针对集合类型的模式匹配
Array List
def caseCollection(arg:Array[String]) {
arg match {
//元素的个数匹配,数据个数为3
case Array(a1, a2, a3) => println("数组的个数为3")
//数组中以 "candle"开头
case Array("candle", _*) => println("以candle开头")
//数组中固定元素筛选
case Array("jack", "tom") => println("固定元素")
case _ => println("其他.......")
}
}
List集合
def caseList(arg:List[String]) {
arg match {
//元素个数匹配 Nil 表示结束
case a1::a2::a3::Nil => println("个数为3")
//以candle开头
case "Candle"::tail => println("以 candle开头")
//包含固定元素
case "jack"::"tom"::Nil => println("xxxxxxxx")
case _ => println("其他的情况")
}
}
5.case class样例类
样例类就是java中javabean的一种快捷定义方式
样例类中只定义field,编译器自动添加set和get方法
case class Student(var name:String, var age:Int)
6.option 和case
option 有两种类型值,一种称为 Some,表示有值,另外一种None,表示没值
val mayMap = Map("candle"->18, "jack"->19, "tom"->13)
def getMapValue(name:String) {
val age = mayMap.get(name)
age match {
case Some(age) => println("age is " + age)
case None => println("没有这个Key")
}
}