Scala中模式匹配
Scala中模式匹配
模式匹配类似于java中switch case,但是scala中的模式匹配功能远强于java中的switch
基本语法
val oper = 'o'
val n1 = 20
val n2 = 10
var res = 0
/**
* 如果匹配成功,则执行 => 后面的代码
* 匹配的顺序是从上到下,匹配到一个就行执行对应的代码
* => 后面的代码块,不需要些break,会自动退出match
* 如果一个都没有匹配到,则执行case _后面的代码块
*/
oper match {
case '+' => res = n1 + n2
case '-' => res = n1 - n2
case '*' => n1 * n2
case '/' => n1 / n2
//if后面称为条件守卫
case _ if(oper == 'o') => println("oper is o")
case _ => println("oper error")
}
类型匹配
Map[String,Int]与Map[Int,String]是两种不同的类型
//在类型匹配之前编译器会先预先检测是否有可能匹配,如果没有则报错
//如果这里不使用:Any的话,下面就有可能会报错
val obj: Any = "xxx"
val result = obj match {
//a的意思是先把obj赋值给a,然后再匹配类型
case a: Int => println("Int类型")
case b: String => println("String类型")
case c: Map[String,Int] => println("Sting-Int类型")
case _ => println("傻逼")
}
Array匹配
def arrayMatch(arr: Any) = arr match {
case Array(0) => println("只有一个0元素的数组")
case Array(0,_) => println("以0开头的,拥有2个元素的数组")
case Array(0,_,3) => println("以1开头,3结尾,中间为任意元素的三个元素的数组")
case Array(8,_*) => println("以8开头的,任意个元素的数组")
case Array(_,_) => println("数组种有两个元素")
//匹配数组种有三个元素,将数组中的元素赋值给x,y,z然后我们就可以做顺序的变换了
case Array(x,y,z) => Array(z,x,y)
}
List匹配
def listMath(list: Any) = list match {
case 0 :: Nil => println("只有一个元素0元素的list")
case 7 :: 9 :: Nil => println("只有7和9的元素的list")
case x::y::z::Nil => println("只有三个元素的list")
case m :: n if n.length>0 => println("拥有头和尾的列表")
case _ => println("匹配不成功")
}
对象匹配
//怎样才能算是对象匹配上呢?
//case种对象的unapply方法(对象提取器)返回Some集合则为匹配成功,返回none集合则为匹配失败
object Demo03 {
def main(args: Array[String]): Unit = {
val num: Double = 36.0
num match {
//当匹配到Square(n),就调用Square的unapply方法
//如果对象提取器unapply(z: Double)返回值some(6),则匹配成功,并同时把6赋值给n
//如果返回的是None,则表示匹配不成功
case Square(n) => println(n)
case _ => println("匹配失败")
}
val names = "xxx"
names match {
//当case后面的对象提取器方法的参数为多个时,则会默认调用def unapplySeq方法
//如果返回对应unapplySeq返回的some
case Name(a,b,x) => println(a,b,x)
case _ => println("傻逼")
}
}
}
object Square {
def apply(z: Double): Double = z * z
//unapply方法是对象提取器
//接收z: Double类型
//返回类型Option[Double]
def unapply(z: Double): Option[Double] = Some(math.sqrt(z))
}
object Name {
def unapplySeq(str: String): Option[Seq[String]] = {
println("xxxxxxxxxxx")
Some(Array("aa","bb","cc"))
}
}