Case Class(十九)

簡介

  Case Class是樣例類,能夠被優化以用於模式匹配。

  • 構造器中的參數如果不被聲明爲var的話,默認是val類型
  • 自動創建伴生對象,實現apply方法,可以不直接顯示地new對象
  • 伴生對象實現unapply方法,從而可以將case class應用於模式匹配
  • 實現toString、hashCode、copy、equals方法

簡單實例

//抽象類Person
abstract class Person

//case class Student
case class Student(name:String,age:Int,studentNo:Int) extends Person
//case class Teacher
case class Teacher(name:String,age:Int,teacherNo:Int) extends Person
//case class Nobody
case class Nobody(name:String) extends Person

object CaseClassDemo{
  def main(args: Array[String]): Unit = {
    //case class 會自動生成apply方法,從而省去new操作
    val p:Person=Student("john",18,1024)  
    //match case 匹配語法  
    p  match {
      case Student(name,age,studentNo)=>println(name+":"+age+":"+studentNo)
      case Teacher(name,age,teacherNo)=>println(name+":"+age+":"+teacherNo)
      case Nobody(name)=>println(name)
    }
  }
}

常用方法

//toString方法演示
scala> val s=Teacher("john",38,1024)
s: Teacher = Teacher(john,38,1024)

//無參copy方法演示
scala> val s1=s.copy()
s1: Teacher = Teacher(john,38,1024)

//copy方法是深度拷貝
scala> println(s eq s1)
false

//equal方法根據對象內容進行比較
scala> println(s equals s1)
true

scala> println(s == s1)
true

//hashcode方法
scala> s1.hashCode
res45: Int = 567742485

//toString方法
scala> s1.toString
res46: String = Teacher(john,38,1024)

//帶一個參數的copy方法
scala> s1.copy(name="stephen")
res47: Teacher = Teacher(stephen,38,1024)
//帶二個參數的copy方法
scala> s1.copy(name="stephen",age=58)
res49: Teacher = Teacher(stephen,58,1024)
//帶三個參數的copy方法
scala> s1.copy(name="stephen",age=58,teacherNo=2015)
res50: Teacher = Teacher(stephen,58,2015)

多參數的Case Class

abstract class Person

case class Student( name:String, age:Int, studentNo:Int) extends Person

case class Teacher( name:String, age:Int, teacherNo:Int) extends Person

case class Nobody( name:String) extends Person

//SchoolClass爲接受多個Person類型參數的類
case class SchoolClass(classDescription:String,persons:Person*)

//下列代碼給出的是其模式匹配應用示例
object CaseClassDemo{
  def main(args: Array[String]): Unit = {
     val sc=SchoolClass("學途無憂網Scala培訓班",Teacher("搖擺少年夢",27,2015),Student("搖擺少年夢",27,2015))
     sc match{
       case SchoolClass(_,_,Student(name,age,studetNo))=>println(name)
       case _ => println("Nobody")
     }
  }
}

sealed case class

sealed關鍵字作用

  • 其修飾的trait,class只能在當前文件裏面被繼承
  • 用sealed修飾的目的是告訴scala編譯器在檢查模式匹配時,讓scala能在編譯時檢查代碼是否有漏掉什麼沒case到的代碼,減少編程的錯誤。

簡單實例

//Person最前面加了個關鍵字sealed
sealed abstract class Person

case class Student( name:String, age:Int, studentNo:Int) extends Person

case class Teacher( name:String, age:Int, teacherNo:Int) extends Person

case class Nobody( name:String) extends Person

case class SchoolClass(classDescription:String,persons:Person*)

object CaseClassDemo{
  def main(args: Array[String]): Unit = {
     val s:Person=Student("john",18,1024)
     //這邊僅僅給出了匹配Student的情況,在編譯時
     //編譯器會提示
     //match may not be exhaustive. It would fail on the following inputs: Nobody(_), Teacher(_, _, _)
     s match{
       case Student(name,age,studentNo)=>println("Student")
     }
  }
}

忠於技術,熱愛分享。歡迎關注公衆號:java大數據編程,瞭解更多技術內容。

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章