Scala 提供了強大的模式匹配機制,應用也非常廣泛。一個模式匹配包含了一系列備選項,每個都開始於關鍵字 case。每個備選項都包含了一個模式及一到多個表達式。箭頭符號 => 隔開了模式和表達式。
-
通配模式、變量匹配和守衛
通配符 “_” 可以用來匹配任意對象。通常在模式匹配中作爲最後一個匹配項,匹配其它所有的輸入對象。
//變量常量匹配;守衛
def varCase(input: String): Unit = {
input match {
case "+" => println("+")
case "-" => println("-")
case ch if ch.length > 1 => println(ch) //給模式添加守衛,相當於一個判斷條件
case _ => println("_")
}
}
-
類型匹配
可以根據表達式的類型進行匹配,在Scala中,我們更傾向於使用這種的模式匹配,而不是使用isInstanceOf
操作符.
//類型匹配
def typeCase(input: Any): Unit = {
input match {
case s: String => println("This is a String var: " + input)
case int: Int => println("This is a Int var: " + input)
case _ => println("This is not Int and String var: " + input)
}
}
-
匹配數組、列表和元組
//匹配數組,列表和元組
def arrayCase(arr: Array[String]): Unit = {
arr match {
case Array("Hello") => println("Array: Hello")
case Array(x, y) => println("length: " + arr.length)
case _ => println("_")
}
}
//匹配列表
def listMatch(list: List[String]): Unit = {
list match {
case "Hello" :: Nil => println("This list only contain hello.")
case "Hello" :: "Scala" :: Nil => println("Hello Scala.")
case x :: y :: Nil => println("x::y")
case _ => println("default list.")
}
}
//匹配元組
def pairMatch(input: Any): Unit = {
input match {
case ("Hello", _) => println("Hello")
case (x, "Hello", "Scala") => println(x + " Hello scala")
case _ => println("default value")
}
}
-
提取器
前面我們看到模式是如何匹配數組,列表和元組的,這些功能背後是提取器機制,帶有從對象中提取值的unapply或unapplySeq方法的對象.unapply方法用於提取固定數量的對象,而unapplySeq提取的是一個序列.
arr match {
case Array(0, x) => ...
...
}
Array伴生對象就是一個提取器,定義了一個unapplySeq方法.該方法被調用時,以被執行匹配動作的表達式作爲參數.Array.unapplySeq(arr)產出一個序列的值,即數組中的值.第一個值與零進行比較,二第二個值被賦值給x.