概述
我们之前已经使用过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("未匹配")
}
}
那是不是所有的类都可以进行这样的模式匹配呢?答案是:
不是 。一个类要想支持模式匹配,则必须要实现一个提取器。
注:
- 提取器指的是unapply()方法
- 样例类自动实现了apply()、unapply()方法,无需我们手动定义
格式
要实现一个类的提取器,只需要在该类的伴生对象中实现一个unapply方法即可。
def unapply(stu:Student):Option[(类型1, 类型2, 类型3...)] = {
if(stu != null) {
Some((变量1, 变量2, 变量3...))
}else {
None
}
}
图解
案例
需求
- 创建一个Student类,包含姓名年龄两个字段
- 实现一个类的提取器,并使用match表达式进行模式匹配,提取类中的字段。
代码
object demo {
class Student(var name:String,var age:Int)
object Student{
def apply(name:String, age:Int) = new Student(name, age)//免new
def unapply(stu:Student): Option[(String,Int)] ={
if(stu!=null){
Some(stu.name,stu.age)
}else{
None
}
}
}
def main(args: Array[String]): Unit = {
//1. 创建一个Student类,包含姓名年龄两个字段
val zhangsan = Student("zhangsan", 20)
//2. 实现一个类的提取器,并使用match表达式进行模式匹配,提取类中的字段。
val maybeTuple = Student.unapply(zhangsan)
println(maybeTuple)
}
}