1. 程式人生 > >Scala中Case Class使用詳細解析

Scala中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") } } } ```

文章來自:https://www.itjmd.com/news/show-4236.html