Scala>scala样例类

样例类

样例类是一种特殊类,它可以用来快速定义一个用于保存数据的类(类似于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)
发布了166 篇原创文章 · 获赞 29 · 访问量 3512

猜你喜欢

转载自blog.csdn.net/qq_44509920/article/details/105351090