目录
提取器(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反编译一个样例类的字节码)