Scala系列21:Scala提取器的使用

2020-09-28 19:58发布

0.提取器(Extractor)

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

  1. // 1. 创建两个样例类

  2. case class Person(name:String, age:Int)

  3. case class Order(id:String)


  4. def main(args: Array[String]): Unit = {

  5. // 2. 创建样例类对象,并赋值为Any类型

  6. val zhangsan:Any = Person("张三", 20)

  7. val order1:Any = Order("001")


  8. // 3. 使用match...case表达式来进行模式匹配

  9. // 获取样例类中成员变量

  10. order1 match {

  11. case Person(name, age) => println(s"姓名:${name} 年龄:${age}")

  12. case Order(id1) => println(s"ID为:${id1}")

  13. case _ => println("未匹配")

  14. }

  15. }

那是不是所有的类都可以进行这样的模式匹配呢?答案是:

不可以的。要支持模式匹配,必须要实现一个提取器。样例类支持自动匹配,那是因为样例类自动实现了apply、unapply方法.

1.定义提取器

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

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

提取器语法格式:

  1. def unapply(stu:Student):Option[(类型1, 类型2, 类型3...)] = {

  2. if(stu != null) {

  3. Some((变量1, 变量2, 变量3...))

  4. }

  5. else {

  6. None

  7. }

  8. }

 示例说明

  • 创建一个Student类,包含姓名年龄两个字段

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

参考代码

  1. class Student(var name:String, var age:Int)


  2. object Student {

  3. def apply(name:String, age:Int) = {

  4. new Student(name, age)

  5. }


  6. def unapply(student:Student) = {

  7. val tuple = (student.name, student.age)


  8. Some(tuple)

  9. }

  10. }


  11. def main(args: Array[String]): Unit = {

  12. val zhangsan = Student("张三", 20)


  13. zhangsan match {

  14. case Student(name, age) => println(s"${name} => ${age}")

  15. }

  16. }

  17. // 张三=>20

作者:涤生手记

链接:https://blog.csdn.net/qq_26442553/article/details/108477259

来源:CSDN
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。