一、Case Class简介
Case Class一般被翻译成样例类,它是一种特殊的类,能够被优化以用于模式匹配,下面的代码定义了一个样例类:
当一个类被声名为case class的时候,scala会帮助我们做下面几件事情:
1
构造器中的参数如果不被声明为var的话,它默认的话是val类型的,但一般不推荐将构造器中的参数声明为var
2 自动创建伴生对象,同时在里面给我们实现子apply方法,使得我们在使用的时候可以不直接显示地new对象
3 伴生对象中同样会帮我们实现unapply方法,从而可以将case class应用于模式匹配,关于unapply方法我们在后面的“提取器”那一节会重点讲解
4 实现自己的toString、hashCode、copy、equals方法
除此之此,case class与其它普通的scala类没有区别
二、Case Class、Case Object与模式配匹
abstract class Person
case class Student(age:Int) extends Person
case class Worker(age:Int,salary:Double) extends Person
case object Shared extends Person
object SomeClass {
def main(args:Array[String]):Unit={
def caseOps(person:Person)=person match{
case Student(age)=>println("I am"+age+"years old")
case Worker(_,salary)=>println("Wow,I got"+salary)
case Shared=>println("No property")
}
caseOps(Student(19))
caseOps(Shared)
//case class会自动生成apply方法,从而省去new操作
val worker=Worker(29,10000.1)
caseOps(worker)
val worker2=worker.copy(salary=19.95)
val worker3=worker.copy(age=30)
}
}
运行结果:
I am 19 years old
No property
Wow,I got10000.1
三、嵌套的Case Class、Case Object与模式配匹
abstract class Item
case class Book(description:String,price:Double) extends Item
case class Bundle(description:String,price:Double,items:Item*) extends Item //第三个参数可以接受多个参数
object Pattern_Match_Case_Class_Nested{
def main(args:Array[String]){
def caseclass_nested(person:Item)=person match{
//art和rest指向当前被传递的对象
case Bundle(_,_,art @ Book(_,_),rest @ _*)=>println(art.description+":"+art.price)
// case Bundle(_,_,Book(descr,_),_*)=>println("description is:"+descr)
case _=>println("Oops!")
}
caseclass_nested(Bundle("111 Special's",30.0,
Book("Scala for the Spark Developer",69.95),
Bundle("Hadoop",40.0),
Book("HIVE",79.96),
Book("HBase",32.95)
))
caseclass_nested(Bundle("1212 Special's",35.0,Book("Spark for the Impatient",39.95)))
}
}
运行结果:
Scala for the Spark Developer:69.95
Spark for the Impatient:39.95