Scala編程基礎(chǔ)25:Scala模式匹配

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方法莉恼,除非顯示給出這些方法的定義拌喉。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市俐银,隨后出現(xiàn)的幾起案子尿背,更是在濱河造成了極大的恐慌,老刑警劉巖捶惜,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件田藐,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)汽久,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門鹤竭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人景醇,你說(shuō)我怎么就攤上這事臀稚。” “怎么了三痰?”我有些...
    開(kāi)封第一講書人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵吧寺,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我散劫,道長(zhǎng)稚机,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任获搏,我火速辦了婚禮赖条,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘常熙。我一直安慰自己谋币,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布症概。 她就那樣靜靜地躺著,像睡著了一般早芭。 火紅的嫁衣襯著肌膚如雪彼城。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,590評(píng)論 1 305
  • 那天退个,我揣著相機(jī)與錄音募壕,去河邊找鬼。 笑死语盈,一個(gè)胖子當(dāng)著我的面吹牛舱馅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播刀荒,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼代嗤,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了缠借?” 一聲冷哼從身側(cè)響起干毅,我...
    開(kāi)封第一講書人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎泼返,沒(méi)想到半個(gè)月后硝逢,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年渠鸽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了叫乌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡徽缚,死狀恐怖憨奸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情猎拨,我是刑警寧澤膀藐,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站红省,受9級(jí)特大地震影響额各,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜吧恃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一虾啦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧痕寓,春花似錦傲醉、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至礼仗,卻和暖如春吐咳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背元践。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工韭脊, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人单旁。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓沪羔,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親象浑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蔫饰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容