Case Class

本文介绍了Scala中的Case Class特性,包括其自动提供的功能如伴生对象、模式匹配支持等,并通过实例展示了如何使用Case Class简化对象创建及进行模式匹配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值