Scala 基礎(十三):Scala 模式匹配(一)

1 match

應用案例java

Scala的模式匹配git

案例代碼完整:
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語句ui

2)若是全部case都不匹配,又沒有寫case _ 分支,那麼會拋出MatchErrorspa

3)每一個case中,不用break語句,自動中斷casecode

4)能夠在match中使用其它類型,而不單單是字符對象

 

5)=> 等價於 java swtich 的 :blog

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)
相關文章
相關標籤/搜索