Scala之提取器(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("未匹配") 
	} 
}

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

注:

  1. 提取器指的是unapply()方法
  2. 样例类自动实现了apply()、unapply()方法,无需我们手动定义

格式

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

def unapply(stu:Student):Option[(类型1, 类型2, 类型3...)] = {
 if(stu != null) { 
 Some((变量1, 变量2, 变量3...)) 
 	}else {
 	None 
 	} 
 }

图解

在这里插入图片描述
在这里插入图片描述

案例

需求

  1. 创建一个Student类,包含姓名年龄两个字段
  2. 实现一个类的提取器,并使用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)
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大数据老人家i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值