Scala 基礎(十三):Scala 模式匹配(一)
阿新 • • 發佈:2020-07-08
1match
應用案例
Scala的模式匹配
案例程式碼完整: package com.atguigu.base object MatchDemo { def main(args: Array[String]): Unit = { // 模式匹配,類似於Java的switch語法 var result = 0 val c = '-' c match { case '-' => result = 1 println("匹配到-") case '+' => result = -1 println("匹配到+") case '%' => { //多行的話,可以換行,可以使用 {} 括起來,也可以不擴 result = 100 println("匹配到%") } case _ => println("沒有匹配到...") } println(result) } }
match的細節和注意事項
1)如果所有case都不匹配,那麼會執行case _ 分支,類似於Java中default語句
2)如果所有case都不匹配,又沒有寫case _ 分支,那麼會丟擲MatchError
3)每個case中,不用break語句,自動中斷case
4)可以在match中使用其它型別,而不僅僅是字元
5)=> 等價於 java swtich 的 :
6)=> 後面的程式碼塊到下一個 case, 是作為一個整體執行,可以使用{} 擴起來,也可以不擴。
2守衛
如果想要表達匹配某個範圍的資料,就需要在模式匹配中增加條件守衛
應用案例
for (ch <- "+-3!") { var sign = 0 var digit = 0 ch match { case '+' => sign = 1 case '-' => sign = -1 // 說明.. case _ if ch.toString.equals("3") => digit = 3 case_ => sign = 2 } println(ch + " " + sign + " " + digit) }
3模式中的變數
如果在case關鍵字後跟變數名,那麼match前表示式的值會賦給那個變數
應用案例
val ch = 'V' ch match { case '+' => println("ok~") case mychar => println("ok~" + mychar) case _ => println ("ok~~") }
4型別匹配
可以匹配物件的任意型別,這樣做避免了使用isInstanceOf和asInstanceOf方法
應用案例
// 型別匹配, obj 可能有如下的型別 val a = 7 val obj = if(a == 1) 1 else if(a == 2) "2" else if(a == 3) BigInt(3) else if(a == 4) Map("aa" -> 1) else if(a == 5) Map(1 -> "aa") else if(a == 6) Array(1, 2, 3) else if(a == 7) Array("aa", 1) else if(a == 8) Array("aa")
val result = obj match { case a : Int => a case b : Map[String, Int] => "物件是一個字串-數字的Map集合" case c : Map[Int, String] => "物件是一個數字-字串的Map集合" case d : Array[String] => "物件是一個字串陣列" case e : Array[Int] => "物件是一個數字陣列" case f : BigInt => Int.MaxValue case _ => "啥也不是" } println(result)
型別匹配注意事項
1)Map[String, Int] 和Map[Int, String]是兩種不同的型別,其它類推。
2)在進行型別匹配時,編譯器會預先檢測是否有可能的匹配,如果沒有則報錯.
val obj = 10 val result = obj match { case a : Int => a case b : Map[String, Int] => "Map集合" case _ => "啥也不是" }
3)一個說明:
val result = obj match {
case i : Int => i
} case i : Int => i 表示 將 i = obj (其它類推),然後再判斷型別
4)如果 case _ 出現在match 中間,則表示隱藏變數名,即不使用,而不是表示預設匹配。
// 型別匹配, obj 可能有如下的型別 val a = 7 val obj = if(a == 1) 1 else if(a == 2) "2" else if(a == 3) BigInt(3) else if(a == 4) Map("aa" -> 1) else if(a == 5) Map(1 -> "aa") else if(a == 6) Array(1, 2, 3) else if(a == 7) Array("aa", 1) else if(a == 8) Array("aa")
val result = obj match { case a : Int => a case _ : BigInt => Int.MaxValue //看這裡! case b : Map[String, Int] => "物件是一個字串-數字的Map集合" case c : Map[Int, String] => "物件是一個數字-字串的Map集合" case d : Array[String] => "物件是一個字串陣列" case e : Array[Int] => "物件是一個數字陣列" case _ => "啥也不是" } println(result)