前言
在上一章中对scala的集合型数据结构做了一个初步的认识及入门,这一节将简单介绍一下scala中的模式匹配。
基本数据类型的模式匹配
变量 match {
case value1 => 代码1
case value2 => 代码2
case _ => 代码n(最终出口)
}
遗憾的是在python中没有类似的写法,我们无法进行对比。但在js里却有类似的写法。但是在scala中又对break进行了省略。
示例代码
def judgeGrade(grade:String): Unit ={
grade match{
case "A" => println("优秀....")
case "B" => println("良好....")
case "C" => println("及格....")
case _ => println("不及格....")
}
}
通过匹配到不同的值,就进入了对应的执行语句中。
case _ => println("不及格....")
其中 这句话是整个模块的出口,当全部都匹配不到时的输出结果。
当然这种匹配模式也可以加入更多的匹配条件。
def judgeGrade(grade:String,school:String): Unit ={
grade match{
case "A" => println("优秀....")
case "B" => println("良好....")
case "C" => println("及格....")
case _ if(school == "高中") => println("高中了需要努力了")
case _ if(school == "高中") => println("不及格....")
}
}
数组匹配
和基本匹配模式一样,改变的只是要匹配的对象变成了数组
def greetingLanguage(array:Array[String]): Unit ={
array match {
case Array("Python") => println("Hi:Python")
case Array(x,y) => println("hi"+x+" ," + y)
case Array("Python", _*) => println("except Python we have many programing language")
case _ => println("Hi: There are others situation")
}
}
greetingLanguage(Array("Python"))
greetingLanguage(Array("Python","Scala"))
greetingLanguage(Array("Python","scala","java"))
greetingLanguage(Array("java","scala","Python")
列表匹配
列表匹配跟数组匹配就十分类似了
def greetingLanguage(list:List[String]): Unit ={
list match {
case "Python"::Nil => println("Hi:Python")
case x::y::Nil => println("hi"+x+" ," + y)
case "Python"::tail => println("except Python we have many programing language")
case _ => println("Hi: There are others situation")
}
}
greetingLanguage(List("Python"))
greetingLanguage(List("Python","Scala"))
greetingLanguage(List("Python","scala","java"))
greetingLanguage(List("java","scala","Python"))
类型匹配
根据匹配到变量的不同类型,走不同的代码块
def matchType(obj:Any): Unit ={
obj match {
case x:Int => println("Int")
case x:String => println("String")
case x:Array[String] => println("Array")
}
}
类匹配
同样match 也支持类匹配
class Person
case class Student(name:String,grade:Int) extends Person
case class Driver(name:String,qualification:String) extends Person
case class Other(name:String) extends Person
def caseClassMatch(person: Person): Unit ={
person match {
case Student(name,grade) => println("student name is "+name+" grade is"+grade)
case Driver(name,qualification) => println("driver name is "+name+" qualification is"+qualification)
case _ => println("other")
}
}