目录

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}")
}
}
本文是转载文章,点击查看原文
如有侵权,请联系 xyy@jishuzhan.net 删除
相关推荐
烁3478 分钟前
每日一题(小白)暴力娱乐篇26
java·开发语言·算法·娱乐
周周记笔记12 分钟前
探索R语言:在线学习资源汇总
开发语言·r语言
zuoming12014 分钟前
c# 系列pdf转图片 各种处理3--net3.1到net8 PDFtoImage
开发语言·pdf·c#
FreeLikeTheWind.22 分钟前
Qt问题之 告别软件因系统默认中文输入法导致错误退出的烦恼
开发语言·c++·windows·经验分享·qt
早睡33534 分钟前
大数据技术之SPARK
大数据·分布式·spark
爱编程的王小美42 分钟前
Flink基础
大数据·flink
余瑾瑜1 小时前
如何在CentOS部署青龙面板并实现无公网IP远程访问本地面板
开发语言·后端·golang
wangnaisheng1 小时前
【C#】CAN通信的使用
开发语言·c#
小白的一叶扁舟1 小时前
Java设计模式全解析(共 23 种)
java·开发语言·设计模式·springboot
小文数模1 小时前
2025年认证杯数学建模C题完整分析论文(共39页)(含模型、可运行代码)
c语言·开发语言·数学建模