Scala系列17:样例类,样例对象以及样例方法使用详解

2020-09-28 19:49发布

目录

0.样例类

0.1定义样例类语法

0.2示例 | 定义一个样例类

1.样例类的方法

1.1 apply方法

 1.2 toString方法

1.3 equals方法

1.4 hashCode方法

1.5  copy方法

2.样例类|样例对象

2.1 示例 | 定义枚举


0.样例类

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

0.1定义样例类语法

语法格式:

case class 样例类名([var/val] 成员变量名1:类型1, 成员变量名2:类型2, 成员变量名3:类型3)

  1. 如果要实现某个成员变量可以被修改,可以添加var

  2. 在[val/var]里的参数是可选的,这一点跟普通类不一样,普通类需要存在。

  3. 其实样例类没有类体{},普通类可有可无。

  4. 注意样例类实现了重写后的toString方法,打印类名会带出类的信息,而普通类则是返回引用地址。

  5. 注意样例类的对象创建不需要new,直接引用赋值即可。

0.2示例 | 定义一个样例类

参考代码

  1. /**示例1 |需求

  2. 定义一个Person样例类,包含姓名和年龄成员变量

  3. 创建样例类的对象实例("张三"、20),并打印它


  4. */

  5. package com.robot.scalademo


  6. object _08ObjectDemo {

  7. case class Person(name:String, age:Int)


  8. def main(args: Array[String]): Unit = {



  9. val zhangsan = Person("张三", 20)

  10. println(zhangsan) //Person(张三,20)


  11. }

  12. }


  13. /**示例2 | 可变成员变量


  14. 定义一个Person样例类,包含姓名和年龄成员变量

  15. 创建样例类的对象实例("张三"、20)

  16. 修改张三的年龄为23岁,并打印码

  17. */



  18. object _02CaseClassDemo {

  19. case class Person(var name:String, var age:Int)


  20. def main(args: Array[String]): Unit = {

  21. val zhangsan = Person("张三", 20)


  22. zhangsan.age = 23


  23. println(zhangsan) //Person(张三,23)

  24. }

  25. }


1.样例类的方法

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

  • apply方法

  • toString方法

  • equals方法

  • hashCode方法

  • copy方法

1.1 apply方法

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

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


  2. object CaseClassDemo {

  3. def main(args: Array[String]): Unit = {

  4. val lisi = CasePerson("李四", 21)

  5. println(lisi.toString)

  6. }

  7. }

 1.2 toString方法

toString返回样例类名称(成员变量1, 成员变量2, 成员变量3....),我们可以更方面查看样例类的成员

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


  2. object CaseClassDemo {

  3. def main(args: Array[String]): Unit = {

  4. val lisi = CasePerson("李四", 21)

  5. println(lisi.toString)

  6. // 输出:CasePerson(李四,21)

  7. }

  8. }

1.3 equals方法

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

示例

  • 创建一个样例类Person,包含姓名、年龄

  • 创建名字年龄分别为"李四", 21的两个对象

  • 比较它们是否相等

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

  2. val lisi2 = CasePerson("李四", 21)

  3. println(lisi1 == lisi2)

  4. // 输出:true

1.4 hashCode方法

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

  1. package com.robot.scalademo


  2. object _08ObjectDemo {

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



  4. def main(args: Array[String]): Unit = {

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

  6. val lisi3 = CasePerson("李四", 21)

  7. val lisi2 = CasePerson("李四", 22)


  8. println(lisi1.hashCode()) //718456491

  9. println(lisi3.hashCode()) //718456491

  10. println(lisi2.hashCode()) // 629649205

  11. }

  12. }

1.5  copy方法

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

示例

  • 创建名字年龄分别为"李四", 21的对象

  • 通过copy拷贝,名字为"王五"的对象

  1. package com.robot.scalademo


  2. object _08ObjectDemo {

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


  4. def main(args: Array[String]): Unit = {

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


  6. val wangwu1 = lisi1.copy() //不带参数复制

  7. val wangwu2 = lisi1.copy(name="王五")


  8. println(wangwu1) //CasePerson(李四,21)

  9. println(wangwu2) //CasePerson(王五,21)


  10. }

  11. }

2.样例类|样例对象

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

样例对象主要作用:

  1. 定义枚举

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

语法格式

case object 样例对象名

2.1 示例 | 定义枚举

需求说明

  • 定义一个性别Sex枚举,它只有两个实例(男性——Male、女性——Female)

  • 创建一个Person类,它有两个成员(姓名、性别)

  • 创建两个Person对象("张三"、男性)、("李四"、"女")

参考代码

  1. package com.robot.scalademo


  2. object _08ObjectDemo {

  3. trait Sex /*定义一个性别特质*/

  4. case object Male extends Sex // 定义一个样例对象并实现了Sex特质

  5. case object Female extends Sex


  6. case class Person(name:String, sex:Sex) //注意后面传入的参数是特质Sex类型的。


  7. def main(args: Array[String]): Unit = {

  8. val zhangsan = Person("张三", Male)

  9. val lisi = Person("李四", Female )

  10. println(zhangsan) //Person(张三,Male) //实际传入的参数继承特质Sex的样例类对象Male。

  11. println(lisi ) //Person("李四", Female )

  12. }

  13. }

作者:涤生手记

链接:https://blog.csdn.net/qq_26442553/article/details/108422079

来源:CSDN
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。