快速學(xué)習(xí)Scala之模式匹配

模式匹配是Scala中非常有特色且強大的功能钉凌。模式匹配類似于Java中的swich case語法即對一個值進行條件判斷,針對不同的條件進行不同的處理矢沿。

但是Scala的模式匹配的功能比Java的swich case語法的功能要強大地多酸纲,Java的swich case語法只能對值進行匹配。Scala的模式匹配除了可以對值進行匹配之外闽坡,還可以對類型進行匹配、對Array和List的元素情況進行匹配媒役、對case class進行匹配宪迟、甚至對有值或沒值(Option)進行匹配次泽。

模式匹配語法

scala使用match case的語法進行模式匹配席爽。

變量 match { 
  case 值1 => 代碼
  case 值2 => 代碼
  case _ => 代碼
}。

如果值為下劃線只锻,則代表了不滿足以上所有情況下的默認情況如何處理。
此外捐寥,match case中,只要一個case分支滿足并處理了握恳,就不會繼續(xù)判斷下一個case分支了。

變量值的模式匹配

基本用法

使用case 值 => 代碼這種語法進行值的模式匹配崇裁。

def convert(number : Int) : String = {
    number match {
      case 1 => "壹"
      case 2 => "貳"
      case 3 => "叁"
      case 4 => "肆"
      case 5 => "伍"
      case 6 => "陸"
      case 7 => "柒"
      case 8 => "捌"
      case 9 => "玖"
      case 10 => "拾"
      case _ => "錯誤"
    }
}

帶if守衛(wèi)

Scala的模式匹配語法可以在值后面再加一個if守衛(wèi)進行雙重過濾束昵。

def performanceRating(score : Int) : String = {
    score match {
      case s if (score >= 90) => "優(yōu)秀"
      case s if (score >= 80) => "良好"
      case s if (score >= 70) => "尚可"
      case s if (score >= 60) => "及格"
      case _ => "差"
    }
}

類型的模式匹配

使用case 變量: 類型 => 代碼這種語法進行類型的模型匹配。

try{
      
}catch{
    case e:IllegalArgumentException=> do something
    case e:FileNotFoundException=> do something
    case e:IOException => do something
    case _:Exception => do something
}

case class的模式匹配

//定義客戶類
class Customer
//定義個人用戶
case class PersonalUser(name:String) extends Customer
//定義企業(yè)用戶
case class EnterpriseUser(name:String) extends Customer
//定義Vip用戶
case class VipUser(name:String) extends Customer
...
/**
  * 提供的服務(wù)
  */
def service(c:Customer):Unit={
    c match{
      case EnterpriseUser(_)=>print("對公業(yè)務(wù)")
      case PersonalUser(_)=>print("對私業(yè)務(wù)")
      case VipUser(_)=>print("對Vip業(yè)務(wù)")
      case _ =>print("?")
    }
}

Option的模式匹配

Scala有一種特殊的類型Option,Option有兩種值巴比,一種是Some匿辩,表示有值榛丢,一種是None,表示沒有值晰赞。Option通常會用于模式匹配中,用于判斷某個變量是有值還是沒有值然走,這比null來的更加簡潔明了戏挡。

val grades = Map("張三" -> "A", "李四" -> "B", "王五" -> "C", "趙大" -> "C")
//成績查詢
def getGrade(name: String) {
  val grade = grades.get(name)
  grade match {
    case Some(grade) => println("你的成績是 " + grade)
    case None => println("對不起,未找到相關(guān)成績拆檬,請聯(lián)系老師")
  }
}

數(shù)組的模式匹配

def arrayMatch(arr : Array[Int]) : String = {
    arr match {
      case Array(_) => "匹配只有一個元素的情況"
      case Array(x, y) => "匹配有兩個元素的情況"
      case Array(0, _*) => "匹配從0開始的情況"
      case _ => "其他情況"
    }
}

List 的模式匹配

def listMatch(list : List[String]) = list match {
    case head :: Nil => "匹配只有一個元素的情況"
    case x :: y :: Nil => "匹配只有兩個元素的情況"
    case "麗麗" :: tail => "匹配以麗麗開始的情況"
    case head :: tail => "匹配多個元素的情況"
    case _ => "其他情況"
}

Tuple的模式匹配

def tupleMatch(t : Tuple2[String, String]) : String = t match {
    case ("A", _) => "匹配以A開始的二元組"
    case (_, "A") => "匹配以A結(jié)束的二元組"
    case _ => "其他情況"
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末竟贯,一起剝皮案震驚了整個濱河市逝钥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖沃琅,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阵难,死亡現(xiàn)場離奇詭異,居然都是意外死亡呜叫,警方通過查閱死者的電腦和手機殿衰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門闷祥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人凯砍,你說我怎么就攤上這事晦款》桑” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵惠昔,是天一觀的道長。 經(jīng)常有香客問我镇防,道長,這世上最難降的妖魔是什么潮饱? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮香拉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘缕溉。我一直安慰自己吃型,他們只是感情好证鸥,可當(dāng)我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布枉层。 她就那樣靜靜地躺著,像睡著了一般鸟蜡。 火紅的嫁衣襯著肌膚如雪膜赃。 梳的紋絲不亂的頭發(fā)上揉忘,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天,我揣著相機與錄音泣矛,去河邊找鬼。 笑死您朽,一個胖子當(dāng)著我的面吹牛狂丝,可吹牛的內(nèi)容都是我干的哗总。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼讯屈,長吁一口氣:“原來是場噩夢啊……” “哼蛋哭!你這毒婦竟也來了耻煤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤哈蝇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后炮赦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體怜跑,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡吠勘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了剧防。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡峭拘,死狀恐怖俊庇,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情辉饱,我是刑警寧澤搬男,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布缔逛,位于F島的核電站,受9級特大地震影響姓惑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜挺益,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一歉糜、第九天 我趴在偏房一處隱蔽的房頂上張望望众。 院中可真熱鬧,春花似錦烂翰、人聲如沸夯缺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽佳恬。三九已至捏境,卻和暖如春毁葱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背倾剿。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工筷频, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留前痘,地道東北人。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓芹缔,卻偏偏與公主長得像坯癣,于是被迫代替她去往敵國和親最欠。 傳聞我的和親對象是個殘疾皇子蓬网,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,033評論 2 355

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

  • 不知不覺已經(jīng)堅持慢跑一年有余鹉勒,大概因為覺得主動長期堅持一件枯燥的事情,總會有點感悟禽额,總覺得應(yīng)該寫點什么,可似乎又無...
    kamidox閱讀 1,221評論 0 4
  • 無題是是個很老的話題皮官,人群中確是嘗提起的。 在我看來捺氢,說起無題藻丢,往往是一道很難很難的題罷摄乒! 孩提時光,有仿佛年紀的...
    肖的救贖閱讀 331評論 5 13
  • 學(xué)到兩點 1.向日葵蕊的處理 2.同色系疊加豐富層次和增加立體感 不過馍佑,少了之前插畫風(fēng)格的很多輔助線條和點斋否。難道是...
    花開兮緩歸閱讀 945評論 0 2
  • # hello
    roger1900閱讀 155評論 0 0