Scala系列17:样例类,样例对象以及样例方法使用详解 蔚落 2022-12-04 03:26 257阅读 0赞 **目录** 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 |需求 定义一个Person样例类,包含姓名和年龄成员变量 创建样例类的对象实例("张三"、20),并打印它 */ package com.robot.scalademo object _08ObjectDemo { case class Person(name:String, age:Int) def main(args: Array[String]): Unit = { val zhangsan = Person("张三", 20) println(zhangsan) //Person(张三,20) } } /**示例2 | 可变成员变量 定义一个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 = 23 println(zhangsan) //Person(张三,23) } } # 1.样例类的方法 # 当我们定义一个样例类,编译器自动帮助我们实现了以下几个有用的方法: * **apply方法** * **toString方法** * **equals方法** * **hashCode方法** * **copy方法** ## 1.1 apply方法 ## apply方法可以让我们快速地使用类名来创建对象。参考以下代码: case class CasePerson(name:String, age:Int) object CaseClassDemo { def main(args: Array[String]): Unit = { val lisi = CasePerson("李四", 21) println(lisi.toString) } } ## 1.2 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) } } ## 1.3 equals方法 ## 样例类自动实现了equals方法,可以直接使用==比较两个样例类是否相等,即所有的成员变量是否相等 **示例** * 创建一个样例类Person,包含姓名、年龄 * 创建名字年龄分别为"李四", 21的两个对象 * 比较它们是否相等 val lisi1 = CasePerson("李四", 21) val lisi2 = CasePerson("李四", 21) println(lisi1 == lisi2) // 输出:true ## 1.4 hashCode方法 ## 样例类自动实现了hashCode方法,如果所有成员变量的值相同,则hash值相同,只要有一个不一样,则hash值不一样。 package com.robot.scalademo object _08ObjectDemo { case class CasePerson(name:String, age:Int) def main(args: Array[String]): Unit = { val lisi1 = CasePerson("李四", 21) val lisi3 = CasePerson("李四", 21) val lisi2 = CasePerson("李四", 22) println(lisi1.hashCode()) //718456491 println(lisi3.hashCode()) //718456491 println(lisi2.hashCode()) // 629649205 } } ## 1.5 copy方法 ## ** 样例类实现了copy方法,可以简单快速创建一个相同的实例对象(不带参数),也可以使用带名参数指定给成员进行重新赋值,创建一个新的样例对象。** **示例** * 创建名字年龄分别为"李四", 21的对象 * 通过copy拷贝,名字为"王五"的对象 package com.robot.scalademo object _08ObjectDemo { case class CasePerson(name:String, age:Int) def main(args: Array[String]): Unit = { val lisi1 = CasePerson("李四", 21) val wangwu1 = lisi1.copy() //不带参数复制 val wangwu2 = lisi1.copy(name="王五") println(wangwu1) //CasePerson(李四,21) println(wangwu2) //CasePerson(王五,21) } } # 2.样例类|样例对象 # **使用case object可以创建样例对象。样例对象是单例的,而且它没有主构造器。** **样例对象主要作用:** 1. 定义枚举 2. 作为没有任何参数的消息传递(后面Akka编程会讲到) **语法格式** case object 样例对象名 ## 2.1 示例 | 定义枚举 ## **需求说明** * 定义一个性别Sex枚举,它只有两个实例(男性——Male、女性——Female) * 创建一个Person类,它有两个成员(姓名、性别) * 创建两个Person对象("张三"、男性)、("李四"、"女") **参考代码** package com.robot.scalademo object _08ObjectDemo { trait Sex /*定义一个性别特质*/ case object Male extends Sex // 定义一个样例对象并实现了Sex特质 case object Female extends Sex case class Person(name:String, sex:Sex) //注意后面传入的参数是特质Sex类型的。 def main(args: Array[String]): Unit = { val zhangsan = Person("张三", Male) val lisi = Person("李四", Female ) println(zhangsan) //Person(张三,Male) //实际传入的参数继承特质Sex的样例类对象Male。 println(lisi ) //Person("李四", Female ) } }
还没有评论,来说两句吧...