模式匹配是scala中非常强大的功能,类似于java中的switch case;在scala中模式匹配用match case 表达,不仅可以匹配变量值,还可以匹配变量类型、Array/List 值、case class 、Option等。
1.模式匹配基本语法
scala 使用match … case …替代swich case,可匹配变量类型、集合元素、有值或者无值,只要有一个case分支满足条件就不会继续往下(java中需要break停止)
Object Test extends Apps{
def judgeGrade(grade: String){
grade match {
case "A" => println("you grade is " + grade)
case "B" => println("Good")
case _ => println("you need work hard")
}
}
judgeGrade("A")
//使用if守卫
def judgeGrade1(grade: String,name: String){
grade match:{
case "A" => println("excellent")
case "B" => println("good")
case _ if name == "joe" =>println(name + " done good")
case _grade if name == "jack" => println(name + " you grade is " + _grade)
case _ => println("work hard")
}
}
}
2. 类型匹配
scala模式匹配的强大在于其对类型的匹配,语法: case 变量: 类型 =》 方法体。
def getException(e: Exception){
e match{
case e1: FileNotFoundException => println("Exception is " + e1)
case e1: IllegalArgumentException => println("exception is " + e2)
case _ : println("don't know Excetion")
}
}
processException(new FileNotFoundException("file no found"))
processException(new IllegalArgumentException("delete zero")) //exception is java.lang.IllegalArgumentException: delete zero
3. 对Array和List匹配
//数组匹配
def greeting(arr: Array[String]){
arr match{
case Array("cys") => println("hi, cys")
case Array(name1,name2,name3) => println(name1+ "," + name2)
case Array("joe", _*) => println("xxx")
case _ =>println("yaya pei")
}
}
greeting(Array("cys")
greeting(Array("cys","joe","jack"))
greeting(Array("cys","joe","jack","joyce"))
//List匹配
def greetingList(list:List[String]){
list match{
case "cys"::Nil => println("cys")
case name1::name2::name3::Nil => println(name1 + "," + name2)
case name1::tail => println(name1 + " introduce your friends" )
case _ => println("xx")
}
}
4.case class 匹配
scala中提供了一种特殊的类,case class, 类似于java中的java been,其中只声明field,java编译时会自动生成getter和setter方法;case class 的主构造函数中的参数通常不需要val或var修饰,默认为val。
class Person
case class Teacher(name: String, subject: String) extends Person
case class Student(name: String, classroom: String) extends Person
def judgeIdentity(p: Person){
p match {
case Student(name,classroom) => println("Student, name is" + name + "classroom is " classroom)
case Teacher(name,subject) => println("Teacher " + name)
case _ => println("don't know identity")
}
}
5.Option与模式匹配
scala中一种特殊类型为Option, 它有两种值【Some,None】,Some表示有值,None表示无值
//Option
def grades = Map("cys" -> "A" ,"joe" -> "B")
def getValue(name: String){
val grade = grades.get(name)
grade match{
case Some(grade) => println("you grade is " + grade)
case None => println(" no name in map" )
}
}