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

6.提取器(Extractor)

6.1 概述

我们之前已经使用过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方法即可。

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

在这里插入图片描述

6.3 示例

需求
  1. 创建一个Student类,包含姓名年龄两个字段
  2. 实现一个类的提取器,并使用match表达式进行模式匹配,提取类中的字段。
参考代码
//案例: 演示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 参考代码

//案例: 随机职业.
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}")
}
}
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值