spark中case关键字,很有用,很强大,case语法与java中的switch语法类似,但比switch更强大。
一、case做模式匹配
1.正则匹配
val Pattern="(a.*)".r//
val v1="spark";
val r=v1 match {
case Pattern(v1)=> "start"
case "1"=> "1"
case "2"=> "2"
case _=> "default"
}
println(r)//default
//假如 val v1= "abcdf" 打印出来的就是start
2. 值匹配
val r=input match {
case 1=> "1"
case 2=> "1"
case 3=> "2"
case _=> "default"
}
假如输入的input=1那么打印出来r的结果就是1
3.范围匹配
val r=input match {
case input if 1 until 5 contains input=> "1to5"
case input if 5 until 10 contains input=> "5to10"
case _=> "not found"
}
假如输入的是input=3,那么打印”1to5",因为3在1和5直接。
4.其他匹配
主要是看if条件是符合写的,本质上雷同
二、Case使用在类class前面声明为case class
class之前添加case可以自动生成equal、hashcode、toString、copy方法 和他的伴生对象,并且为伴生对象生成apply、unapply方法
//case class 是一个模式类,而case object 是全局的一个唯一的实例,
//模式类之间不能互相继承,必须统一继承一个抽象类或者trait
//class DataFrameWork
//模式类,与普通类没什么区别,只是一定要有参数
//case class ComputationFramework(name:String,popular:Boolean)extends DataFrameWork
//case class StorageFramework(name:String,popular:Boolean)extends DataFrameWork
//模式类的方法
case class ForFun(name:String) ;
object fun2{
def main(args: Array[String]): Unit = {
val forfun = ForFun.apply("Jack") ;
println(forfun.name) ;
val forFun2 = new ForFun("Nacy") ;
println(forFun2.name+":"+forFun2.hashCode()+":"+forFun2.toString);
println(forfun equals forFun2) ;
}
}
case 声明类的好处
1. 创建 case class 和它的伴生 object
2. 实现了 apply 方法让你不需要通过 new 来创建类实例
3. 默认为主构造函数参数列表的所有参数前加 val
4. 添加天然的 hashCode、equals 和 toString 方法。由于 == 在 Scala 中总是代表 equals,所以 case class 实例总是可比较的
5. case 进行模式匹配,一旦匹配成功即返回。
下面的三个操作效果是等价的
val p0 = new Person("json", 29, "Blue") // normal constructor
val p1 = Person("json", 29, "Blue") // this uses apply
val p2 = Person.apply("json", 29, "Blue") // using apply manually