Scala是没有Java中的switch case语法的,相对应的,Scala提供了更加强大的match case语法,即模式匹配
Scala的match case与Java的switch case最大的不同点在于,Java的switch case仅能匹配变量的值,比1、2、3等;而Scala的match case可以匹配各种情况,比如变量的类型、集合的元素、有值或无值。
scala模式匹配只要匹配到一种情况就不再继续,不需要break来跳出case。
1、具体值的模式匹配
模式匹配是可以加入if守卫进行条件判断
scala> def someThingFilter(data : String, age: Int){
| data match{
| case "A" => println("A")
| case "B" if age > 18 => println("B")
| case "B" if age <= 18 => println("B and age is : " + age)
| case _ if age > 18 => println("teenager")
| case _ => println(data + " " + age)
| }
| }
someThingFilter: (data: String, age: Int)Unit
// case 中可以进行条件判断
scala> someThingFilter("B", 18)
B and age is : 18
scala> someThingFilter("A", 18)
A
scala> someThingFilter("c", 18)
c 18
scala> someThingFilter("c", 17)
c 17
scala> someThingFilter("c", 19)
teenager
同时匹配的时候可以定义变量将data传入到dataA,并可以调用dataA
scala> def someThingFilter(data : String, age: Int){
| data match{
| case "A" => println("A")
| case "B" if age > 18 => println("B")
| case "B" if age <= 18 => println("B and age is : " + age)
| case dataA if dataA == "C" || age > 18 => println("teenager" + " "
+ dataA)
| case _ => println("Unknown")
| }
| }
someThingFilter: (data: String, age: Int)Unit
scala> someThingFilter("C", 19)
teenager C
2、类型的模式匹配
object ProTest2 {
def main(args: Array[String]): Unit = {
def animalJudge(a : Animal){
a match{
case c: Cat => {println("It's a cat"); c.eat}
case d: Dog => println("It's a dog"); d.eat
case _ => println("Unknown! ")
}
}
val dog = new Dog()
animalJudge(new Cat())
animalJudge(new Dog())
animalJudge(dog)
}
}
abstract class Animal{
def eat
}
class Cat extends Animal{
override def eat{
println("Fish !")
}
}
class Dog extends Animal{
override def eat{
println("Bone !")
}
}
对数组进行模式匹配:
object ProTest2 {
def main(args: Array[String]): Unit = {
def arrayJudge(array : Array[String]){
array match{
// 具体值完全匹配
case Array("Jerry", "Tom") => println("Tom is Jerry's friend!")
// 数组值个数匹配
case Array(name1, name2, name3) => println("The length of arry is " + array.length)
// 匹配某个值开头
case Array("Jerry", _*) => println("array start with Jerry")
case _ => println("Unknown!")
}
}
arrayJudge(Array("Jerry", "Tom"))
arrayJudge(Array("Jerry", "Tom", "Bob"))
arrayJudge(Array("Tom", "Bob"))
}
}
Tom is Jerry's friend!
The length of arry is 3
Unknown!
3 case class 模式匹配(样式类)
// 定义一个Person类
scala> class Person
defined class Person
// case class定义一个Student继承Person类
scala> case class Student(name: String, socore: Int) extends Person
defined class Student
// case class定义一个Teacher继承Person类
scala> case class Teacher(name: String, subject: String) extends Person
defined class Teacher
// 模式匹配
scala> def content(person: Person){
| person match{
| case Student(name, score) => println("name is " + name + " , score = " +
score)
| case Teacher(name, subject) => println(name + " teacher " + subject)
| case _ => println("Unknown")
| }
| }
content: (person: Person)Unit
scala> content(Student("Jerry", 33))
name is Jerry , score = 33
scala> content(Teacher("Tom", "math"))
Tom teacher math
4、Option与模式匹配
object ProTest2 {
def main(args: Array[String]): Unit = {
val student = Map("Jerry" -> 12, "Tom" -> 33, "Bob" -> 2)
def idIsExist(name : String){
val isExist = student.get(name)
isExist match{
// 具体值完全匹配
case Some(isExist) => println(name + " is my student !")
// 数组值个数匹配
case None => println("Sorry !")
}
}
idIsExist("Jerry")
idIsExist("Marry")
}
}
输出:
Jerry is my student !
Sorry !