模式匹配是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分支满足并处理了,就不会继续判断下一个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守卫
Scala的模式匹配语法可以在值后面再加一个if守卫进行双重过滤。
def performanceRating(score : Int) : String = {
score match {
case s if (score >= 90) => "优秀"
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
//定义企业用户
case class EnterpriseUser(name:String) extends Customer
//定义Vip用户
case class VipUser(name:String) extends Customer
...
/**
* 提供的服务
*/
def service(c:Customer):Unit={
c match{
case EnterpriseUser(_)=>print("对公业务")
case PersonalUser(_)=>print("对私业务")
case VipUser(_)=>print("对Vip业务")
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("对不起,未找到相关成绩,请联系老师")
}
}
数组的模式匹配
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结束的二元组"
case _ => "其他情况"
}
网友评论