模式匹配是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 _ => "其他情況"
}