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

举报
Lansonli 发表于 2021/09/28 22:47:26 2021/09/28
【摘要】 目录 提取器(Extractor)  定义提取器 提取器(Extractor)  我们之前已经使用过scala中非常强大的模式匹配功能了,通过模式匹配,我们可以快速匹配样例类中的成员变量。例如: // 定义样例类case class SubmitTask(id: String...

目录

提取器(Extractor) 

定义提取器


提取器(Extractor) 

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


  
  1. // 定义样例类
  2. case class SubmitTask(id: String, name: String)
  3. case class HeartBeat(time: Long)
  4. case object CheckTimeOutTask
  5. val msg1 = SubmitTask("001""task-001")
  6. val msg2 = HeartBeat(1000)
  7. val msg3 = CheckTimeOutTask
  8. val list = List(msg1, msg2, msg3)
  9. list(2match {
  10.     // 可以使用模式匹配快速匹配到到SubmitTask样例类中的id和name
  11.     case SubmitTask(id, name) => println(s"id=$id, name=$name")
  12.     case HeartBeat(time) => println(s"time=$time")
  13.     case CheckTimeOutTask => println("检查超时")
  14. }

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

 

定义提取器

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

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

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


  
  1. class Student {
  2.   var name:String = _   // 姓名
  3.   var age:Int = _       // 年龄
  4.   
  5.   // 实现一个辅助构造器
  6.   def this(name:String, age:Int) = {
  7.     this()
  8.     
  9.     this.name = name
  10.     this.age = age
  11.   }
  12. }
  13. object Student {
  14.   def apply(name:String, age:Int): Studentnew Student(name, age)
  15.   // 实现一个解构器
  16.   def unapply(arg: Student): Option[(StringInt)] = Some((arg.name, arg.age))
  17. }
  18. object extractor_DEMO {
  19.   def main(args: Array[String]): Unit = {
  20.     val zhangsan = Student("张三"20)
  21.     zhangsan match {
  22.       case Student(name, age) => println(s"姓名:$name 年龄:$age")
  23.       case _ => println("未匹配")
  24.     }
  25.   }
  26. }

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

 

文章来源: lansonli.blog.csdn.net,作者:Lansonli,版权归原作者所有,如需转载,请联系作者。

原文链接:lansonli.blog.csdn.net/article/details/116807681

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。