2021年大数据常用语言Scala(三十五):scala高级用法 提取器(Extractor)
【摘要】
目录
提取器(Extractor)
定义提取器
提取器(Extractor)
我们之前已经使用过scala中非常强大的模式匹配功能了,通过模式匹配,我们可以快速匹配样例类中的成员变量。例如:
// 定义样例类case class SubmitTask(id: String...
目录
提取器(Extractor)
我们之前已经使用过scala中非常强大的模式匹配功能了,通过模式匹配,我们可以快速匹配样例类中的成员变量。例如:
-
// 定义样例类
-
case class SubmitTask(id: String, name: String)
-
case class HeartBeat(time: Long)
-
case object CheckTimeOutTask
-
-
val msg1 = SubmitTask("001", "task-001")
-
val msg2 = HeartBeat(1000)
-
val msg3 = CheckTimeOutTask
-
-
val list = List(msg1, msg2, msg3)
-
-
list(2) match {
-
// 可以使用模式匹配快速匹配到到SubmitTask样例类中的id和name
-
case SubmitTask(id, name) => println(s"id=$id, name=$name")
-
case HeartBeat(time) => println(s"time=$time")
-
case CheckTimeOutTask => println("检查超时")
-
}
那是不是所有的类都可以进行这样的模式匹配呢?答案是不可以的。要支持模式匹配,必须要实现一个提取器。
定义提取器
之前我们学习过了,实现一个类的伴生对象中的apply方法,可以用类名来快速构建一个对象。伴生对象中,还有一个unapply方法。与apply相反,unapply是将该类的对象,拆解为一个个的元素。
要实现一个类的提取器,只需要在该类的伴生对象中实现一个unapply方法即可。
示例:实现一个类的解构器,并使用match表达式进行模式匹配,提取类中的字段。
-
class Student {
-
var name:String = _ // 姓名
-
var age:Int = _ // 年龄
-
-
// 实现一个辅助构造器
-
def this(name:String, age:Int) = {
-
this()
-
-
this.name = name
-
this.age = age
-
}
-
}
-
-
-
object Student {
-
def apply(name:String, age:Int): Student = new Student(name, age)
-
-
// 实现一个解构器
-
def unapply(arg: Student): Option[(String, Int)] = Some((arg.name, arg.age))
-
}
-
-
object extractor_DEMO {
-
def main(args: Array[String]): Unit = {
-
val zhangsan = Student("张三", 20)
-
-
zhangsan match {
-
case Student(name, age) => println(s"姓名:$name 年龄:$age")
-
case _ => println("未匹配")
-
}
-
}
-
}
样例类自动实现了apply、unapply方法(可以使用scalap反编译一个样例类的字节码)
文章来源: lansonli.blog.csdn.net,作者:Lansonli,版权归原作者所有,如需转载,请联系作者。
原文链接:lansonli.blog.csdn.net/article/details/116807681
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)