目录

提取器(Extractor)

定义提取器


提取器(Extractor) 

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

// 定义样例类
case class SubmitTask(id: String, name: String)
case class HeartBeat(time: Long)
case object CheckTimeOutTaskval msg1 = SubmitTask("001", "task-001")
val msg2 = HeartBeat(1000)
val msg3 = CheckTimeOutTaskval list = List(msg1, msg2, msg3)list(2) match {// 可以使用模式匹配快速匹配到到SubmitTask样例类中的id和namecase SubmitTask(id, name) => println(s"id=$id, name=$name")case HeartBeat(time) => println(s"time=$time")case CheckTimeOutTask => println("检查超时")
}

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

定义提取器

之前我们学习过了,实现一个类的伴生对象中的apply方法,可以用类名来快速构建一个对象。伴生对象中,还有一个unapply方法。与apply相反,unapply是将该类的对象,拆解为一个个的元素。

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

示例:实现一个类的解构器,并使用match表达式进行模式匹配,提取类中的字段。

class Student {var name:String = _   // 姓名var age:Int = _       // 年龄// 实现一个辅助构造器def this(name:String, age:Int) = {this()this.name = namethis.age = age}
}object Student {def apply(name:String, age:Int): Student = new Student(name, age)// 实现一个解构器def unapply(arg: Student): Option[(String, Int)] = Some((arg.name, arg.age))
}object extractor_DEMO {def main(args: Array[String]): Unit = {val zhangsan = Student("张三", 20)zhangsan match {case Student(name, age) => println(s"姓名:$name 年龄:$age")case _ => println("未匹配")}}
}

样例类自动实现了apply、unapply方法(可以使用scalap反编译一个样例类的字节码)

2021年大数据常用语言Scala(三十五):scala高级用法 提取器(Extractor)相关推荐

  1. 2021年大数据常用语言Scala(三十一):scala面向对象 特质(trait)

    目录 特质(trait) 作为接口使用 定义具体的方法 定义具体方法和抽象方法 定义具体的字段和抽象的字段 实例对象混入trait trait调用链 trait的构造机制 trait继承class 特 ...

  2. 2021年大数据常用语言Scala(三):Scala解释器

    目录 scala解释器 启动scala解释器 执行scala代码 退出解释器 scala解释器 后续我们会使用scala解释器来学习scala基本语法,scala解释器像Linux命令一样,执行一条代 ...

  3. 2021年大数据常用语言Scala(四):基础语法学习 声明变量

    目录 声明变量 语法格式 在解释器中定义一个变量 val和var变量 使用类型推断来定义变量 惰性赋值 声明变量 我们将来每一天编写scala程序都会定义变量.那scala语言如何定义变量呢? 语法格 ...

  4. 2021年大数据常用语言Scala(一):Scala简介

    目录 一.Scala简介 为什么使用scala Scala对比Java 案例 一.Scala简介 scala是运行在JVM上的多范式编程语言,同时支持面向对象和面向函数编程 多范式:就是包含多种编程思 ...

  5. 2021年大数据常用语言Scala(十八):基础语法学习 Map对象

    目录 Map对象 不可变Map 可变Map Map基本操作 Map对象 Map可以称之为映射.它是由键值对组成的集合.在scala中,Map也分为不可变Map和可变Map. 不可变Map 定义 语法 ...

  6. 2021年大数据常用语言Scala(二):Scala开发环境安装

    目录 开发环境安装 安装JDK 安装scala SDK 步骤 具体操作 安装IDEA scala插件 步骤 开发环境安装 学习如何编写scala代码之前,需要先安装scala编译器以及开发工具 sca ...

  7. 2021年大数据常用语言Scala(十七):基础语法学习 Set

    目录 Set 不可变集 可变集 Set Set(集)是代表没有重复元素的集合.Set具备以下性质: 元素不重复 不保证插入顺序 和List正好相反, List: 元素可以重复 保证插入顺序 scala ...

  8. 2021年大数据常用语言Scala(三十八):scala高级用法 隐式转换和隐式参数

    目录 隐式转换和隐式参数 隐式转换 自动导入隐式转换方法 隐式转换的时机 隐式参数 隐式转换和隐式参数 隐式转换和隐式参数是scala非常有特色的功能,也是Java等其他编程语言没有的功能.我们可以很 ...

  9. 2021年大数据常用语言Scala(三十六):scala高级用法 泛型

    目录 泛型 定义一个泛型方法 定义一个泛型类 上下界 协变.逆变.非变 非变 协变 逆变 泛型 scala和Java一样,类和特质.方法都可以支持泛型.我们在学习集合的时候,一般都会涉及到泛型. sc ...

最新文章

  1. linux条件判断:常用练习添加用户
  2. 【Guava】使用Guava的RateLimiter做限流
  3. 企业建立数据驱动决策该如何做?终于有大神总结全了
  4. Google 图片下载工具
  5. 软件开发需要重视对异常的处理
  6. throw 烦人_烦人的简单句子聚类
  7. 苹果因芯片短缺优先生产iPhone 13 常规iPad平均交付时间超7周
  8. QuantLib 金融计算——随机过程之概述
  9. KVM的安装和配置命令详解
  10. 【斐波那切数列】LeetCode 70. Climbing Stairs
  11. swagger php修改成中文,PHP使用swagger自动生成API文档
  12. 1992-2021合集 全国大学生数学建模竞赛(历年赛题题目+定位分析)
  13. java fop_XSL-FO 和FOP相关技术详解(转载)
  14. 一个在线运行的Taro小程序完整实例
  15. js实现图片放大镜效果
  16. python 获取硬盘信息失败请谨慎操作_老毛桃pe装机工具出现获取硬盘信息失败,请谨慎操作...
  17. 计算机二进制造价便宜,二进制计算器/换算
  18. apmserver导入MySQL_APMServ MySQL 错误
  19. Kotlin学习笔记(八)by的作用,属性委托和类的委托,和Lazy的关系
  20. ElasticSearch搜索引擎(高级)

热门文章

  1. html+spring boot简单的ajax数据传输实现
  2. 进入Docker容器命令
  3. linux环境下快速配置hadoop集群免密登录
  4. SpringBoot2.x 不反回空值属性
  5. 商城数据库表设计介绍
  6. python Django 管理站点1.3
  7. python 往excel 里面写数据
  8. Tomcat内存溢出解决方法
  9. 【原创】大叔经验分享(65)spark读取不到hive表
  10. Vim 命令、操作、快捷键全集