900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > 大数据常用语言Scala(三十五):scala高级用法 提取器(Extractor)

大数据常用语言Scala(三十五):scala高级用法 提取器(Extractor)

时间:2021-08-23 04:19:32

相关推荐

大数据常用语言Scala(三十五):scala高级用法 提取器(Extractor)

目录

提取器(Extractor)

定义提取器

提取器(Extractor)

我们之前已经使用过scala中非常强大的模式匹配功能了,通过模式匹配,我们可以快速匹配样例类中的成员变量。例如:

// 定义样例类caseclassSubmitTask(id:String,name:String)caseclassHeartBeat(time:Long)caseobjectCheckTimeOutTaskvalmsg1 =SubmitTask("001","task-001")valmsg2 =HeartBeat(1000)valmsg3 =CheckTimeOutTaskvallist =List(msg1,msg2,msg3)list(2)match{// 可以使用模式匹配快速匹配到到SubmitTask样例类中的id和namecaseSubmitTask(id,name)=>println(s"id=$id, name=$name")caseHeartBeat(time)=>println(s"time=$time")caseCheckTimeOutTask =>println("检查超时")}

那是不是所有的类都可以进行这样的模式匹配呢?答案是不可以的。要支持模式匹配,必须要实现一个提取器

定义提取器

之前我们学习过了,实现一个类的伴生对象中的apply方法,可以用类名来快速构建一个对象。伴生对象中,还有一个unapply方法。与apply相反,unapply是将该类的对象,拆解为一个个的元素。

要实现一个类的提取器,只需要在该类的伴生对象中实现一个unapply方法即可。

示例:实现一个类的解构器,并使用match表达式进行模式匹配,提取类中的字段。

classStudent {varname:String =_ // 姓名varage:Int=_ // 年龄// 实现一个辅助构造器defthis(name:String,age:Int)={this()this.name =namethis.age =age}}objectStudent {defapply(name:String,age:Int):Student =newStudent(name,age)// 实现一个解构器defunapply(arg:Student):Option[(String,Int)]=Some((arg.name,arg.age))}objectextractor_DEMO {defmain(args:Array[String]):Unit={valzhangsan =Student("张三",20)zhangsan match{caseStudent(name,age)=>println(s"姓名:$name年龄:$age")case_ =>println("未匹配")}}}

样例类自动实现了apply、unapply方法(可以使用scalap反编译一个样例类的字节码)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。