欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Scala>scala样例类

程序员文章站 2022-06-14 17:00:54
...

样例类

样例类是一种特殊类,它可以用来快速定义一个用于保存数据的类(类似于Java POJO类),在后续要学习并发编程和spark、flink这些框架也都会经常使用它。

定义样例类

语法格式

case class 样例类名([var/val] 成员变量名1:类型1, 成员变量名2:类型2, 成员变量名3:类型3)
  • 如果要实现某个成员变量可以被修改,可以添加var
  • 默认为val,可以省略

示例 | 定义一个样例类

需求

  • 定义一个Person样例类,包含姓名和年龄成员变量
  • 创建样例类的对象实例(“张三”、20),并打印它

参考代码

object _01CaseClassDemo {
 case class Person(name:String, age:Int)
​
 def main(args: Array[String]): Unit = {
   val zhangsan = Person("张三", 20)println(zhangsan)
}
}

示例 | 可变成员变量

需求

  • 定义一个Person样例类,包含姓名和年龄成员变量
  • 创建样例类的对象实例(“张三”、20)
  • 修改张三的年龄为23岁,并打印

参考代码

object _02CaseClassDemo {
 case class Person(var name:String, var age:Int)
​
 def main(args: Array[String]): Unit = {
   val zhangsan = Person("张三", 20)
​
   zhangsan.age = 23println(zhangsan)
}
}

样例类的方法

当我们定义一个样例类,编译器自动帮助我们实现了以下几个有用的方法:

  • apply方法
  • toString方法
  • equals方法
  • hashCode方法
  • copy方法

apply方法

apply方法可以让我们快速地使用类名来创建对象。参考以下代码:

case class CasePerson(name:String, age:Int)
​
object CaseClassDemo {
 def main(args: Array[String]): Unit = {
   val lisi = CasePerson("李四", 21)
   println(lisi.toString)
}
}

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方法,可以直接使用==比较两个样例类是否相等,即所有的成员变量是否相等

示例

  • 创建一个样例类Person,包含姓名、年龄
  • 创建名字年龄分别为"李四", 21的两个对象
  • 比较它们是否相等
val lisi1 = CasePerson("李四", 21)
val lisi2 = CasePerson("李四", 21)
println(lisi1 == lisi2)
// 输出:true

hashCode方法

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

示例

  • 创建名字年龄分别为"李四", 21的对象
  • 再创建一个名字年龄分别为"李四", 22的对象
  • 分别打印这两个对象的哈希值
val lisi1 = CasePerson("李四", 21)
val lisi2 = CasePerson("李四", 22)println(lisi1.hashCode())
println(lisi2.hashCode())

copy方法

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

示例

  • 创建名字年龄分别为"李四", 21的对象
  • 通过copy拷贝,名字为"王五"的对象
val lisi1 = CasePerson("李四", 21)
​
val wangwu = lisi1.copy(name="王五")
println(wangwu)
相关标签: Scala