scala的case class

32 阅读1分钟

case class 的定义

case class 是 Scala 中一种特殊的类,它用于创建不可变的数据容器。

package caseclass

object caseclass01 {
  class Student(var id:String,var name:String) {
  }
  def main(args: Array[String]): Unit = {
    val stu1 = new Student("1","小花")
    val stu2 = new Student("1","小花")
    println(stu1) //caseclass.caseclass01$Student@4c203ea1

    println(stu1 == stu2) //false

    val set1 = Set(stu1,stu2)
    println(set1) //Set(caseclass.caseclass01$Student@4c203ea1, caseclass.caseclass01$Student@47f6473)
  }
}

运用equals方法

package caseclass

object caseclass01 {
  class Student(var id:String,var name:String) {
    override def equals(obj: Any): Boolean = {
      val other = obj.asInstanceOf[Student]
      other.id == id && other.name == name
    }
    override def toString:String = {
      s"Student(${id},${name})"
    }
  }
  def main(args: Array[String]): Unit = {
    val stu1 = new Student("1","小花")
    val stu2 = new Student("1","小花")
    println(stu1) //Student(1,小花)

    println(stu1 == stu2) //true

    val set1 = Set(stu1,stu2)
    println(set1) //Set(Student(1,小花))
  }
}

改为case class样例类,与运用了equals方法的运行结果一样

package caseclass

object caseclass01 {
  case class Student(var id:String,var name:String) {
  
  }
  def main(args: Array[String]): Unit = {
    val stu1 = new Student("1","小花")
    val stu2 = new Student("1","小花")
    println(stu1) //Student(1,小花)

    println(stu1 == stu2) //true

    val set1 = Set(stu1,stu2)
    println(set1) //Set(Student(1,小花))
  }
}

case class的特点

1.case class可以在定义对象时,省略new

object caseclass02 {
  case class Student1(var id:String,var name:String) {

  }
  def main(args: Array[String]): Unit = {
    //省略new
    val stu1 = Student1("1","小花")
    println(stu1)

2.case class的属性在默认情况下是val,只读的。如果希望修改,需要主动改为var

object caseclass02 {
  case class Student1(id:String,name:String) {

  }
  def main(args: Array[String]): Unit = {
    val stu1 = Student1("1","小花")
 // stu1.name = "小明"  报错!默认val,不能修改

3.case class 会自动重写equals,tiString...

object caseclass02 {
  case class Student1(id:String,name:String) {

  }
  def main(args: Array[String]): Unit = {
    val stu1 = Student1("1","小花")
    val stu2 = new Student1("1","小花")
    
    println(stu1 == stu2) //true 因为重写了equals方法