本篇作为scala快速入门系列的第三十四篇博客,为大家带来的是关于提取器的内容。
提取器(Extractor)
我们之前已经使用过scala中非常强大的模式匹配功能了,通过模式匹配,我们可以快速匹配样例类中的成员变量。例如:
那是不是所有的类都可以进行这样的模式匹配呢?答案是:
不可以的
要想支持模式匹配,必须要实现一个提取器
[NOTE]
- 样例类自动实现了apply、unapply方法
定义提取器
之前我们学习过了,实现一个类的伴生对象中的apply方法,可以用类名来快速构建一个对象。伴生对象中,还有一个unapply
方法。与apply相反,unapply是将该类的对象,拆解为一个个的元素。
要实现一个类的提取器,只需要在该类的伴生对象中实现一个unapply方法即可。
语法格式
示例
- 创建一个Student类,包含姓名年龄两个字段
- 实现一个类的解构器,并使用match表达式进行模式匹配,提取类中的字段
参数代码
代码语言:javascript复制/**
* 通过实现提取器,让普通的类(非样例类)能够支持模式匹配
*
*/
object _15UnapplyDemo {
// 1. 定义一个普通的类
class Student(var name: String, var age: Int)
// 2. 实现unapply方法来定义提取器
object Student {
def unapply(student: Student): Option[(String, Int)] =
if (student != null) {
// 返回一个Some封装数据 -- 供下面模式匹配使用
Some(student.name, student.age)
}
else {
None
}
}
def main (args: Array[String] ): Unit = {
// 3. 创建对象,使用模式匹配来提取值
val student = new Student("张三",20)
student match {
case Student(name,age) => println(s"${name},${age}")
}
}
}
本期的内容分享就到这里了,喜欢的小伙伴们记得点个赞,持续关注哟~下期为大家介绍的是scala的泛型,敬请期待٩(๑>◡<๑)۶