Scala第十一章节(提取器和随机职业案例)

6.提取器(Extractor)

6.1 概述

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

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()方法, 无需我们手动定义

6.2 格式

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

语法格式
scala 复制代码
def unapply(stu:Student):Option[(类型1, 类型2, 类型3...)] = {
if(stu != null) {
Some((变量1, 变量2, 变量3...))
}
else {
None
}
}
图解

6.3 示例

需求
  1. 创建一个Student类,包含姓名年龄两个字段
  2. 实现一个类的提取器,并使用match表达式进行模式匹配,提取类中的字段。
参考代码
scala 复制代码
//案例: 演示Scala中的提取器.
//所谓的提取器就是: 在类的伴生对象中, 重写一个unapply()方法即可.
object ClassDemo17 {
//1. 创建一个Student类,包含姓名年龄两个字段
class Student(var name:String, var age:Int)
//2. 实现一个类的提取器,并使用match表达式进行模式匹配,提取类中的字段。
object Student { //伴生对象.
def apply(name:String, age:Int) = new Student(name, age) //免new
def unapply(s: Student): Option[(String, Int)] = { //相当于把对象 拆解成 其各个
属性.
if (s != null)
Some(s.name, s.age)
else
None
}
}
//main方法, 作为程序的主入口.
def main(args: Array[String]): Unit = {
//3. 创建Student类的对象.
val s = new Student("糖糖", 73) //普通方式创建对象.
val s2 = Student("糖糖", 73) //免new, 创建对象, apply方法保证
//4. 打印对象的属性值
println(s2.name + "..." + s.age) //普通方式获取对象的属性值
//5. 通过提取器获取对象中的方法.
val result = Student.unapply(s2)
println(result)
}
}

7. 案例:随机职业

7.1 需求

  1. 提示用户录入一个数字(1~5), 然后根据用户录入的数字, 打印出他/她上辈子的职业.
  2. 假设: 1-> 一品带刀侍卫, 2 -> 宰相, 3 -> 江湖郎中, 4 -> 打铁匠, 5 -> 店小二.

7.2 目的

考察 **键盘录入, 模式匹配 **相关内容.

7.3 步骤

  1. 提示用户录入数字, 并接收.
  2. 通过模式匹配获取该用户上辈子的职业.
  3. 打印结果.

7.4 参考代码

scala 复制代码
//案例: 随机职业.
object ClassDemo18 {
def main(args: Array[String]): Unit = {
//1. 提示用户录入数字, 并接收.
println("请录入一个数字(1~5), 我来告诉您上辈子的职业: ")
val num = StdIn.readInt()
//2. 通过模式匹配获取该用户上辈子的职业.
//假设: 1-> 一品带刀侍卫, 2 -> 宰相, 3 -> 江湖郎中, 4 -> 打铁匠, 5 -> 店小二.
val occupation = num match {
case 1 => "一品带刀侍卫"
case 2 => "宰相"
case 3 => "江湖郎中"
case 4 => "打铁匠"
case 5 => "店小二"
case _ => "公公"
}
//3. 打印结果.
println(s"您上辈子的职业是: ${occupation}")
}
}
相关推荐
SelectDB4 小时前
Apache Doris Python UDF:让 SQL 直接调用 Python 生态,支撑 Agent 时代复杂业务逻辑
大数据·数据库·python
ApacheSeaTunnel6 小时前
当多表数据涌入,Apache SeaTunnel 如何巧妙化解主键冲突?
大数据·开源·数据集成·seatunnel·技术分享·数据同步
大大大大晴天3 天前
Hudi Metadata Table 与 Hive Sync (HMS)怎么选?
大数据
手可摘星辰7773 天前
一次线上FlinkCDC异常排查复盘
大数据·flink
大大大大晴天3 天前
Hudi技术内幕:Metadata Table原理与实践
大数据
大大大大晴天4 天前
Hudi技术内幕:深入解析Index索引机制
大数据
阿里云大数据AI技术5 天前
Flink Forward Asia 2026 深圳启幕:Agentic Streaming for AI,开启实时智能新范式
大数据·flink
SelectDB5 天前
阶跃星辰基于 SelectDB 构建 PB 级 Agent 可观测平台
大数据·数据库·aigc
大大大大晴天8 天前
Hudi技术内幕:RecordPayload到RecordMerger
大数据
SelectDB9 天前
秒级弹性、最高降本 70%:SelectDB Serverless 如何重塑云数仓资源效率
大数据·后端·云原生