scala的模式匹配功能十分强大
如果cae中涉及到多个类型,那么匹配的变量要不就都是a类型,要么是所有case中类型的父类,
比如 a match{
case x …
case y …
case z …
}
要么 x y z 都是a的类型,要么 就是都是a的子类
1 简单匹配(对比java swich语句)
val a: Int = 1;
a match {
case 1 => println(a + 1)
case 2 => println(a + 2)
case _ => println(a + 3)
}
val b: String = "1";
b match {
case "a" => println("a")
case "b" => println("b")
case "c" => println("c")
case _ => println("other")
}
2 类型匹配
val a:Any="1";
a match {
case x:Integer => println("Int")
case y:String => println("String")
case _ => println("otherType")
}
x,y不写的话编译不报错,但是运行会报错
3 条件判断
val a: Int =1;
a match {
case x if a>0 && a<=10 => println("x")
case y if a>10 && a<=20 => println("y")
case z if a>20 && a<=30 => println("z")
case _ =>println("other")
}
4 匹配数组/元组/list
val arr: Array[String] = Array("zhang","li","zhao","wang")
arr match{
case Array("zhang","li") => println("x")
case Array("li",_*) => println("xx")
//相当于匹配个数,并且把数据赋值给变量
case Array(zhang,li,zhao,wang) => println(zhang+" "+ li +" " + zhao + " " +wang )
case _ =>println("ohter")
}
val tupe = (1,"a",1.00)
tupe match{
case (1,"a",2) => println("x")
case (_,"a",3) => println("xx")
case (x,_,_) =>println(x)
case _ =>println("ohter")
}
val list: List[Int] = List(1,2,3,4)
list match {
case 1 :: b => println(b)
case 1 :: Nil => println(1)
case null => println(null)
case Nil => println(Nil)
case l:List[Int] if list(2)==2 => println("xxx")
}
5 变量匹配(spark中非常有用)
case class Person ( var name: String,var age:Int,var address:String)
object Person{
def main(args: Array[String]): Unit = {
val liu: Person = new Person("liu",11,"上海市")
val Person(name,age,address)=liu
//val Person(name,_,address)=liu
println(name)
println(age)
println(address)
}
}