scala的模式匹配与java的switch case相似,但是switch case只能对值进行判断,scala还可以对类型,集合进行模式匹配。其中最重要的是对case class 匹配。
其中有多种的匹配的模式:
常量变量匹配
def bigData(data : String): Unit ={
data match {
case "spark" => println("spark")
case "hadoop" => println("hadoop")
// case 中实际上是偏函数
case _ if data == "luo" => println("Luo") // 使用守卫
case data_ if data_ == "carey" => println("carey") // 可以把值传入赋给新的变量 匹配的是if 后面的变量
case _ => println("something else")
}
}
类型模式
def exception(e : Exception): Unit ={
e match {
case fileEx : FileNotFoundException => println("file not fuond",fileEx) // 新定义的变量只是接受赋值 而她的类型才是重要的
case _ : Exception => println("exception some what",e)
}
}
```
匹配集合 序列化模式
```
def match_collec(array : Any): Unit ={
array match {
case Array("scala") => println("scala arr")
case Array("hello","scala","mm") => println("mm")
case Array(one,two) => println(one,two) // 对数组的元素的个数进行匹配 会将第一个值赋给one 第二个值赋给two 元组模式
case Array("hello",_*) => println("array start with hello") // 匹配开始为为hello的数组 使用_* 通配
case List(_,"one","owo") => println("match list") // 使用占位符
case _ => println("something else")
}
}
```
案例类
构造器模式
```
// case class 的参数会自动用 val修饰 编译器自动生成伴生对象 伴生对象的unapply() 方法 接受参数执行就生成 新实例
class Person
case class Worker(name:String,age:Int) extends Person
case class Student(name:String,books:Int) extends Person
def match_construct(p: Person): Unit ={
p match {
//构造器模式必须将Person类定义为case class,否则需要自己定义伴生对象并实现unapply方法。
case Worker(name,age) => println("worker",name,age)
case Student(name,books) => println(name,"have",books)
case _ => println("unknown this ")
}
}
```
网友评论