一、scala匹配模式
scala有三种匹配模式
- 基本模式匹配
- 模式守卫
- 类型匹配
注:匹配模式是从上往下匹配的,在后面的匹配中可能case之间调换位置,匹配结果就不一样。
基本模式匹配
传入什么基本就对相应元素元素进行匹配,输出匹配上的元素相应的输出。
案例演示:
def matchTest(x:Int):String=x match {
case 1 => "one"
case 2 => "two"
case 3 => "three"
case _ => "many"
}
println(matchTest(3))
println(matchTest(2))
println(matchTest(8))
}
模式守卫
对于一般基本匹配模式,传入的x只能值一个值进行匹配,匹配上就输出相应的值。但是x只能一个一个值进行匹配,并不能匹配一个范围。但是在模式守卫中可以添加if条件,进行匹配的守卫,同时也可以圈定匹配范围。
案例演示:
def matchTest2(x:Int):String= x match {
case i if i==100 => "满分大神"
case i if i>=90 && i<100 =>"相当优秀"
case i if i>=80 && i<90 => "良好"
case i if i>=70 && i<80 => "一般"
case i if i>=60 && i<70 => "及格"
case i if i>=0 && i<60 => "不及格"
case _ => "成绩不合法"
}
println(matchTest2(20))
类型匹配
scala匹配模式中也可以匹配传来数据的类型,判断数据类型匹配成功则输出相应值。
案例演示:
def matchTest03(x:Any):String = x match {
case x:Int => "this is Int"
case x:String => "this is String"
case _ => "this is not Int and String"
}
println(matchTest03(2))
}
二、样例类
样例类是在scala中经常用在模式匹配中,当一个类被定义成为case类后,Scala会自动帮你创建一个伴生对象并帮你实现了一系列方法且带来了不少好处。
样例类的定义
//定义一个样例类
case class Students(name:String,age:Int)
三、对样例类进行模式匹配
def matchTest04(x:Students)=x match {
case Students(name, age) => println(age)
case Students(name, 19) => println(name)
case Students("zs", age) => println(age)
case _ => println("no matches")
}
//调用
val stu1 = Students("zs",19)
matchTest04(stu1)
matchTest04(Students("Tom",15))
四、普通类的模式匹配
普通类要想进行模式匹配,需要创建对象,需要自己创建半生类,创建半生对象。使用unapply方法。才能进行模式匹配。
案例演示:
object MatchDemo01 {
def main(args: Array[String]): Unit = {
//非样例类的模式匹配,需要使用半生对象实现unplay方法
def matchTest05(x:Student)=x match {
case Student(name,age) if age<20 => println("young")
case Student(name,age) if age>30 => println("old")
}
matchTest05(Student("zhangsan",18))
matchTest05(Student("lisi",35))
}
}
//定义一个普通的类
class Student(n:String,a:Int){
//定义一下成员变量
var name:String=n
var age:Int=a
}
object Student{
def apply(n: String, a: Int): Student = new Student(n, a)
def unapply(arg: Student): Option[(String, Int)] = {
//实现提取器的逻辑代码
if(arg==null) None else Some(arg.name,arg.age)
}
}