Scala 支持模式匹配機制,能夠代替 swith 語句、執行類型檢查、以及支持析構表達式等。java
Scala 不支持 swith,能夠使用模式匹配 match...case
語法代替。可是 match 語句與 Java 中的 switch 有如下三點不一樣:git
object ScalaApp extends App {
def matchTest(x: Int) = x match {
case 1 => "one"
case 2 => "two"
case _ if x > 9 && x < 100 => "兩位數" //支持條件表達式 這被稱爲模式守衛
case _ => "other"
}
println(matchTest(1)) //輸出 one
println(matchTest(10)) //輸出 兩位數
println(matchTest(200)) //輸出 other
}
複製代碼
object ScalaApp extends App {
def matchTest[T](x: T) = x match {
case x: Int => "數值型"
case x: String => "字符型"
case x: Float => "浮點型"
case _ => "other"
}
println(matchTest(1)) //輸出 數值型
println(matchTest(10.3f)) //輸出 浮點型
println(matchTest("str")) //輸出 字符型
println(matchTest(2.1)) //輸出 other
}
複製代碼
匹配元組示例:github
object ScalaApp extends App {
def matchTest(x: Any) = x match {
case (0, _, _) => "匹配第一個元素爲 0 的元組"
case (a, b, c) => println(a + "~" + b + "~" + c)
case _ => "other"
}
println(matchTest((0, 1, 2))) // 輸出: 匹配第一個元素爲 0 的元組
matchTest((1, 2, 3)) // 輸出: 1~2~3
println(matchTest(Array(10, 11, 12, 14))) // 輸出: other
}
複製代碼
匹配數組示例:編程
object ScalaApp extends App {
def matchTest[T](x: Array[T]) = x match {
case Array(0) => "匹配只有一個元素 0 的數組"
case Array(a, b) => println(a + "~" + b)
case Array(10, _*) => "第一個元素爲 10 的數組"
case _ => "other"
}
println(matchTest(Array(0))) // 輸出: 匹配只有一個元素 0 的數組
matchTest(Array(1, 2)) // 輸出: 1~2
println(matchTest(Array(10, 11, 12))) // 輸出: 第一個元素爲 10 的數組
println(matchTest(Array(3, 2, 1))) // 輸出: other
}
複製代碼
數組、列表和元組能使用模式匹配,都是依靠提取器 (extractor) 機制,它們伴生對象中定義了 unapply
或 unapplySeq
方法:數組
這裏以數組爲例,Array.scala
定義了 unapplySeq
方法:數據結構
def unapplySeq[T](x : scala.Array[T]) : scala.Option[scala.IndexedSeq[T]] = { /* compiled code */ }
複製代碼
unapplySeq
返回一個序列,包含數組中的全部值,這樣在模式匹配時,才能知道對應位置上的值。app
樣例類是一種的特殊的類,它們被通過優化以用於模式匹配,樣例類的聲明比較簡單,只須要在 class
前面加上關鍵字 case
。下面給出一個樣例類及其用於模式匹配的示例:大數據
//聲明一個抽象類
abstract class Person{}
複製代碼
// 樣例類 Employee
case class Employee(name: String, age: Int, salary: Double) extends Person {}
複製代碼
// 樣例類 Student
case class Student(name: String, age: Int) extends Person {}
複製代碼
當你聲明樣例類後,編譯器自動進行如下配置:優化
val
;equals, hashCode, toString, copy
等方法;apply
方法,使得能夠不用 new 關鍵字就能構造出相應的對象;unapply
方法,以支持模式匹配。除了上面的特徵外,樣例類和其餘類相同,能夠任意添加方法和字段,擴展它們。spa
樣例的伴生對象中自動生成 unapply
方法,因此樣例類能夠支持模式匹配,使用以下:
object ScalaApp extends App {
def matchTest(person: Person) = person match {
case Student(name, _) => "student:" + name case Employee(_, _, salary) => "employee salary:" + salary
case _ => "other"
}
println(matchTest(Student("heibai", 12))) //輸出: student:heibai
println(matchTest(Employee("ying", 22, 999999))) //輸出: employee salary:999999.0
}
複製代碼
更多大數據系列文章能夠參見 GitHub 開源項目: 大數據入門指南