快速学习Scala之模式匹配

2018-09-28  本文已影响2人  固安李庆海

模式匹配是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 _ => "其他情况"
}
上一篇下一篇

猜你喜欢

热点阅读