Scala样例类
程序员文章站
2022-06-14 16:57:48
...
文章目录
1.概述
在Scala中, 样例类是一种特殊类,一般是用于保存数据的(类似于Java POJO类), 在并发编程以及Spark、Flink这些框架中都会经常使用它。
2.格式
case class 样例类名([var/val] 成员变量名1:类型1, 成员变量名2:类型2, 成员变量名3:类型3){}
- 变量修饰符可以不写,如果不写,则默认的修饰符是val
- 如果要实现某个成员变量值可以被修改,则需手动添加var来修饰此变量
3.案例
需求:
-
定义样例类Person,包含姓名和年龄这两个成员变量.
其中: 姓名用val修饰, 年龄用var修饰
-
在测试类中创建Person类的对象, 并打印它的属性值.
-
尝试修改姓名, 年龄这两个成员变量的值, 并观察结果.
代码:
object demo {
//1. 创建一个Person样例类, 属性为: 姓名, 年龄.
case class Person(name:String = "张三",var age:Int = 23) {}
def main(args: Array[String]): Unit = {
//2. 创建Person类型的对象, 然后打印属性值.
val p = new Person()
println(p)
//3. 尝试修改对象p的属性值
//p.name = "李四" //这样写会报错, 因为样例类的成员变量默认修饰符是: val
p.age = 24
println(p)
}
}
4.样例类中的默认方法
当我们定义一个样例类后,编译器会自动帮助我们生成一些方法, 常用的如下:
- apply()方法
- toString()方法
- equals()方法
- hashCode()方法
- copy()方法
- unapply()方法
功能详解:
-
apply()方法
- 可以让我们快速地使用类名来创建对象, 省去了new这个关键字
- 例如:
val p = Person()
-
toString()方法
- 可以让我们通过输出语句打印对象时, 直接打印该对象的各个属性值.
- 例如:
println(p) 打印的是对象p的各个属性值, 而不是它的地址值
-
equals()方法
- 可以让我们直接使用
==
来比较两个样例类对象的所有成员变量值是否相等. - 例如:
p1 == p2 比较的是两个对象的各个属性值是否相等, 而不是比较地址值
- 可以让我们直接使用
-
hashCode()方法
- 用来获取对象的哈希值的. 即: 同一对象哈希值肯定相同, 不同对象哈希值一般不同.
-
例如:
val p1 = new Person("张三", 23) val p2 = new Person("张三", 23) println(p1.hashCode() == p2.hashCode()) //结果为: true
-
copy()方法
-
可以用来快速创建一个属性值相同的实例对象,还可以使用带名参数的形式给指定的成员变量赋值.
-
例如:
val p1 = new Person("张三", 23) val p2 = p1.copy(age = 24) println(p1) //结果为: 张三, 23 println(p2) //结果为: 张三, 24
-
unapply()方法
- 一般用作
提取器
, 但是它需要一些铺垫知识, 我们暂时还没学到, 在后续章节详细解释.
- 一般用作