模式匹配是Scala函數(shù)值和閉包后第二大應(yīng)用功能。Scala為模式匹配提供了極大的支持,處理消息。
模式匹配包括一系列備選項,每個替代項以關(guān)鍵字大小寫為單位。每個替代方案包括一個模式和一個或多個表達(dá)式,如果模式匹配,將會進(jìn)行評估計算。箭頭符號=>
將模式與表達(dá)式分離。
嘗試以下示例程序,它顯示匹配的整數(shù)值。
示例
object Demo {
def main(args: Array[String]) {
println(matchTest(3))
}
def matchTest(x: Int): String = x match {
case 1 => "one"
case 2 => "two"
case _ => "many"
}
}
將上述程序保存在源文件:Demo.scala中,使用以下命令編譯和執(zhí)行此程序。
D:\>scalac Demo.scala
D:\>scala Demo
many
具有case
語句的塊定義了一個將整數(shù)映射到字符串的函數(shù)。match關(guān)鍵字提供了一種方便的方式來應(yīng)用一個函數(shù)(如上面的模式匹配函數(shù))到一個對象。
請嘗試以下示例程序,其中的值與不同類型的模式相匹配。
object Demo {
def main(args: Array[String]) {
println(matchTest("two"))
println(matchTest("test"))
println(matchTest(1))
}
def matchTest(x: Any): Any = x match {
case 1 => "one"
case "two" => 2
case y: Int => "scala.Int"
case _ => "many"
}
}
將上述程序保存在源文件:Demo.scala中,使用以下命令編譯和執(zhí)行此程序。
D:\>scalac Demo.scala
D:\>scala Demo
2
many
one
case
類是用于與case
表達(dá)式進(jìn)行模式匹配的特殊類。在語法上,這些是帶有特殊修飾符的標(biāo)準(zhǔn)類:case
。
嘗試以下,它是一個簡單的模式匹配示例使用case
類。
object Demo {
def main(args: Array[String]) {
val alice = new Person("Alice", 25)
val bob = new Person("Bob", 32)
val charlie = new Person("Charlie", 32)
for (person <- List(alice, bob, charlie)) {
person match {
case Person("Alice", 25) => println("Hi Alice!")
case Person("Bob", 32) => println("Hi Bob!")
case Person(name, age) => println(
"Age: " + age + " year, name: " + name + "?")
}
}
}
case class Person(name: String, age: Int)
}
將上述程序保存在源文件:Demo.scala中,使用以下命令編譯和執(zhí)行此程序。
D:\>scalac Demo.scala
D:\>scala Demo
Hi Alice!
Hi Bob!
Age: 32 year, name: Charlie?
添加case
關(guān)鍵字會導(dǎo)致編譯器自動添加一些有用的功能。該關(guān)鍵字表示與模式匹配中的case
表達(dá)式的關(guān)聯(lián)。
首先,編譯器會自動將構(gòu)造函數(shù)轉(zhuǎn)換為不可變字段(vals
)。 val
關(guān)鍵字是可選的。 如果想要可變字段,請使用var
關(guān)鍵字。 因此,構(gòu)造函數(shù)參數(shù)列表更短。
其次,編譯器會自動對類進(jìn)行equals
,hashCode
和toString
方法,該方法使用指定為構(gòu)造函數(shù)參數(shù)的字段。 所以,我們不再需要自己的toString()
方法。
最后,Person
類的主體變?yōu)榭?,因為我們沒有定義任何方法!