scala的提取器(Extractor)

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

// 1. 创建两个样例类
case class Person(name:String, age:Int)
case class Order(id:String)

def main(args: Array[String]): Unit = {
    // 2. 创建样例类对象,并赋值为Any类型
    val zhangsan:Any = Person("张三", 20)
    val order1:Any = Order("001")

    // 3. 使用match...case表达式来进行模式匹配
    // 获取样例类中成员变量
    order1 match {
        case Person(name, age) => println(s"姓名:${name} 年龄:${age}")
        case Order(id1) => println(s"ID为:${id1}")
        case _ => println("未匹配")
    }
}

那是不是所有的类都可以进行这样的模式匹配呢?答案是:
不可以的。要支持模式匹配,必须要实现一个提取器。
在这里插入图片描述
定义提取器
之前我们学习过了,实现一个类的伴生对象中的apply方法,可以用类名来快速构建一个对象。伴生对象中,还有一个unapply方法。与apply相反,unapply是将该类的对象,拆解为一个个的元素
在这里插入图片描述
在这里插入图片描述
要实现一个类的提取器,只需要在该类的伴生对象中实现一个unapply方法即可。
语法格式:
def unapply(stu:Student):Option[(类型1, 类型2, 类型3...)] = { if(stu != null) { Some((变量1, 变量2, 变量3...)) } else { None } }
示例
示例说明
创建一个Student类,包含姓名年龄两个字段
实现一个类的解构器,并使用match表达式进行模式匹配,提取类中的字段。
参考代码:

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

object Student {
    def apply(name:String, age:Int) = {
        new Student(name, age)
    }

    def unapply(student:Student) = {
        val tuple = (student.name, student.age)

        Some(tuple)
    }
}

def main(args: Array[String]): Unit = {
    val zhangsan = Student("张三", 20)

    zhangsan match {
        case Student(name, age) => println(s"${name} => ${age}")
    }
}

在这里插入图片描述
结果:
在这里插入图片描述

发布了151 篇原创文章 · 获赞 339 · 访问量 23万+

猜你喜欢

转载自blog.csdn.net/qq_45765882/article/details/104335768
今日推荐