Scala提供了強(qiáng)大的模式匹配機(jī)制疲恢,應(yīng)用非常廣泛笨蚁。一個(gè)模式匹配包含了一系列備選項(xiàng)睹晒,每個(gè)備選項(xiàng)都開(kāi)始于關(guān)鍵字case。每個(gè)備選項(xiàng)都包含了一個(gè)模式和若干個(gè)表達(dá)式括细。模式和表達(dá)式之間使用箭頭”=>”分隔伪很。
1.Scala模式匹配的使用
下面的例子演示了整型值模式匹配的使用:
object Test1 {
def main(args:Array[String]) {
println(matchTest(3));
}
def matchTest(x:Int):String = x match {
case 1 => "one";
case 2 => "two";
case _ => "many";
}
}
編譯并執(zhí)行上述代碼,輸出結(jié)果如下:
E:\Test>scalac Test1.scala
E:\Test>scala Test1
many
match對(duì)應(yīng)于Java里面的switch奋单,但是寫在選擇器表達(dá)式之后锉试,即:選擇器 match {備選項(xiàng)}。match表達(dá)式通過(guò)以代碼編寫的先后順序來(lái)嘗試每個(gè)模式來(lái)完成計(jì)算辱匿,只要發(fā)現(xiàn)一個(gè)匹配的case键痛,剩下的case不會(huì)繼續(xù)匹配炫彩,因此不需要像Java那樣使用break跳出。
下面的例子演示了不同數(shù)據(jù)類型的模式匹配:
object Test2 {
def main(args:Array[String]) {
println(matchTest("two"));
println(matchTest("test"));
println(matchTest(1));
println(matchTest(6));
}
def matchTest(x:Any):Any = x match {
case 1 => "one";
case "two" => 2;
case y:Int => "scala.Int";
case _ => "many";
}
}
編譯并執(zhí)行上述代碼絮短,輸出結(jié)果如下:
E:\Test>scalac Test2.scala
E:\Test>scala Test2
2
many
one
scala.Int
Scala的模式匹配比Java的switch強(qiáng)大的多江兢,支持多種類型的匹配。上例中第一個(gè) case 對(duì)應(yīng)整型數(shù)值 1丁频,第二個(gè) case 對(duì)應(yīng)字符串值” two”杉允,第三個(gè) case 對(duì)應(yīng)類型模式,用于判斷傳入的值是否為整型席里,相比使用isInstanceOf來(lái)判斷類型叔磷,使用模式匹配更好。第四個(gè) case 表示默認(rèn)的全匹配備選項(xiàng)奖磁,即沒(méi)有找到其他匹配時(shí)的匹配項(xiàng)改基,類似 switch 中的 default。
2.使用樣例類
Scala模式匹配遠(yuǎn)不止上面那些既定的類型咖为,還可以使用樣例類來(lái)自定義case類型秕狰。樣例類就是使用case class定義的類,樣例類是種特殊的類躁染,經(jīng)過(guò)優(yōu)化可以用戶模式匹配鸣哀。
下面的例子演示了樣例類的使用:
object Test3 {
def main(args:Array[String]) {
var alice = new Person("Alice", 25);
var bob = new Person("Bob",32);
var 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("Name : "+name+", Age : "+age);
}
}
}
case class Person(name:String, age:Int);
}
編譯并執(zhí)行上述代碼,輸出結(jié)果如下:
E:\Test>scalac Test3.scala
E:\Test>scala Test3
Hi Alice !
Hi Bob !
Name : Charlie, Age : 32
在聲明樣例類時(shí)吞彤,下面的過(guò)程自動(dòng)發(fā)生了:
- 構(gòu)造器的每個(gè)參數(shù)都成為val我衬,除非顯示聲明為var,但是不推薦這個(gè)做饰恕;
- 在伴生對(duì)象中提供了apply方法挠羔,所以可以不使用new關(guān)鍵字就可以創(chuàng)建對(duì)象;
- 提供了unapply方法使模式匹配可以工作懂盐;
- 生成toString褥赊,equals,hashCOde和copy方法莉恼,除非顯示給出這些方法的定義拌喉。