2021年大数据常用语言Scala(三十二):scala高级用法 样例类

Posted Lansonli

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021年大数据常用语言Scala(三十二):scala高级用法 样例类相关的知识,希望对你有一定的参考价值。

目录

样例类

定义样例类

样例类方法

样例对象


样例类

样例类是一种特殊类,它可以用来快速定义一个用于保存数据的类(类似于Java POJO类),而且它会自动生成apply方法,允许我们快速地创建样例类实例对象。后面,在并发编程和spark、flink这些框架也都会经常使用它。

 

定义样例类

语法结构:

case class 样例类名(成员变量名1:类型1, 成员变量名2:类型2, 成员变量名3:类型3)[{类体}]

示例1:

// 定义一个样例类
// 样例类有两个成员name、age
case class CasePerson(name:String, age:Int)

// 使用var指定成员变量是可变的
case class CaseStudent(var name:String, var age:Int)

object CaseClassDemo {
  def main(args: Array[String]): Unit = {
    // 1. 使用new创建实例
    val zhagnsan = new CasePerson("张三", 20)
    println(zhagnsan)

    // 2. 使用类名直接创建实例
    val lisi = CasePerson("李四", 21)
    println(lisi)

    // 3. 样例类默认的成员变量都是val的,除非手动指定变量为var类型
    //lisi.age = 22  // 编译错误!age默认为val类型

    val xiaohong = CaseStudent("小红", 23)
    xiaohong.age = 24
    println(xiaohong)
  }
}

 

样例类方法

 

toString方法

toString返回:样例类名称(成员变量1, 成员变量2, 成员变量3....)

case class CasePerson(name:String, age:Int)

object CaseClassDemo {
  def main(args: Array[String]): Unit = {
    val lisi = CasePerson("李四", 21)
    println(lisi.toString)
    // 输出:CasePerson(李四,21)
  }
}

 

equals方法

样例类自动实现了equals方法,可以直接使用==比较两个样例类是否相等,即所有的成员变量是否相等

val lisi1 = CasePerson("李四", 21)
val lisi2 = CasePerson("李四", 21)
println(lisi1 == lisi2)
// 输出:true

 

hashCode方法

样例类自动实现了hashCode方法,如果所有成员变量的值相同,则hash值相同,只要有一个不一样,则hash值不一样。

val lisi1 = CasePerson("李四", 21)
val lisi2 = CasePerson("李四", 22)

println(lisi1.hashCode())
println(lisi2.hashCode())

 

copy方法

样例类实现了copy方法,可以快速创建一个相同的实例对象,可以使用带名参数指定给成员进行重新赋值。

val lisi1 = CasePerson("李四", 21)

val wangwu = lisi1.copy(name="王五")
println(wangwu)

 

样例对象

 

使用case object可以创建样例对象。样例对象是单例的,而且它没有主构造器。样例对象是可序列化的。格式:

case object 样例对象名

它主要用在两个地方:

定义枚举

作为没有任何参数的消息传递(后面Akka编程会讲到)

 

示例:定义枚举

trait Sex /*定义一个性别特质*/
case object Male extends Sex // 定义一个样例对象并实现了Sex特质
case object Female extends Sex 

case class Person(name:String, sex:Sex)

object CaseClassDemo {
  def main(args: Array[String]): Unit = {
    val zhangsan = Person("张三", Male)

    println(zhangsan)
  }
}

 

示例:定义消息

case class StartSpeakingMessage(textToSpeak: String)
// 消息如果没有任何参数,就可以定义为样例对象
case object StopSpeakingMessage
case object PauseSpeakingMessage
case object ResumeSpeakingMessage

 

样例类可以使用类名(参数1, 参数2...)快速创建实例对象

定义样例类成员变量时,可以指定var类型,表示可变。默认是不可变的

样例类自动生成了toString、equals、hashCode、copy方法

样例对象没有主构造器,可以使用样例对象来创建枚举、或者标识一类没有任何数据的消息

以上是关于2021年大数据常用语言Scala(三十二):scala高级用法 样例类的主要内容,如果未能解决你的问题,请参考以下文章

2021年大数据常用语言Scala(三十一):scala面向对象 特质(trait)

2021年大数据常用语言Scala(三十):scala面向对象 继承(extends)

2021年大数据常用语言Scala(三十六):scala高级用法 泛型

2021年大数据常用语言Scala(三十三):scala高级用法 模式匹配

2021年大数据常用语言Scala(三十五):scala高级用法 提取器(Extractor)

2021年大数据常用语言Scala(三十七):scala高级用法 高阶函数用法