Scala 入门-提取器对象(match case)

2024-06-03 13:38

本文主要是介绍Scala 入门-提取器对象(match case),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

专栏原创出处:github-源笔记文件 ,github-源码 ,欢迎 Star,转载请附上原文出处链接和本声明。

Scala 编程语言专栏系列笔记,系统性学习可访问个人复盘笔记-技术博客 Scala 编程语言

什么是提取器对象

提取器对象是一个包含有 unapply 方法的单例对象。

  • unapply 方法接受一个实例对象然后返回最初创建它所用的参数。

  • 提取器常用在模式匹配和偏函数中。

unapply 返回结果定义

  • 方式 1:提取单个 T 类型的值,def unapply(obj: A): Option[T]

  • 方式 2:提取多个值,类型分别为 T1,…,Tn,可以把它们放在一个可选的元组中, def unapply(obj: A): Option[(T1, ..., T2)]

  • 方式 3:判断真假,可以返回一个 Boolean 类型的值,def unapply(obj: A): Boolean

  • 方式 4:提取值的数量不固定,根据输入来返回随机数量的值,提取方法必须定义为 unapplySeq,def unapplySeq(obj: A): Option[Seq[T]]

方式 1-示例

提取单个值

  import scala.util.Randomobject CustomerID {def apply(name: String) = s"$name--${Random.nextLong}"def unapply(customerID: String): Option[String] = {val stringArray: Array[String] = customerID.split("--")if (stringArray.tail.nonEmpty) Some(stringArray.head) else None}}// CustomerID("Sukyoung") 是简化语法,默认调用了 CustomerID.apply("Sukyoung"),返回一个字符串。val customer1ID = CustomerID("Sukyoung")  // Sukyoung--23098234908customer1ID match {// 第一项匹配默认是在调用提取器方法 unapply,并将结果绑定到 name 上case CustomerID(name) => println(name)  // prints Sukyoungcase _ => println("Could not extract a CustomerID")}val customer2ID = CustomerID("Nico")// 变量定义可以使用提取模式引入变量,提取器方法 unapply 可以用来初始化变量 name// 等价于 val name = CustomerID.unapply(customer2ID).getval CustomerID(name) = customer2IDprintln(name)  // prints Nico

方式 2-示例

提取多个值

  trait School {def name: Stringdef age: Int}class Student(val name: String, val age: Int, val score: Double) extends Schoolclass Teacher(val name: String, val age: Int) extends Schoolobject Student {def unapply(student: Student): Option[(String, Int, Double)] =Some((student.name, student.age, student.score))}object Teacher {def unapply(teacher: Teacher): Option[(String, Int)] =Some((teacher.name, teacher.age))}val lisa = new Student("Lisa", 14, 97)lisa match {// 不需要 age 属性,可以使用 _ 占位符代替case Student(name, _, score) => println(s"学生 $name 获得 $score 分")case _ => println("老师没有评分资格")}

方式 3-示例

提取 boolean 值

  trait School {def name: Stringdef age: Int}class Student(val name: String, val age: Int, val score: Double) extends Schoolclass Teacher(val name: String, val age: Int) extends Schoolobject Student {def unapply(student: Student): Option[(String, Int, Double)] =Some((student.name, student.age, student.score))}object Teacher {def unapply(teacher: Teacher): Option[(String, Int)] =Some((teacher.name, teacher.age))}object GoodStudent {def unapply(student: Student): Boolean = student.score > 90}val lisa = new Student("Lisa", 14, 97)lisa match {// boolean 类型返回值模式匹配写法,student 相当于匹配到的对象实例case student @ GoodStudent() => println(s"学生 ${student.name} 成绩优异")case _ => println("老师没有评分资格")}

方式 4-示例

提取值数量不固定

  object Split {def unapplySeq(str: String): Option[Seq[String]] =Some(str.split("-").toSeq)}val numberStr = "111-222-333-444"numberStr match {// 由于切分后得到的结果集合元素数量未知,因此使用该模式定义提取方法 first 为结果集第一个元素case Split(first,tail @ _*) => println(s"第一个元素:$first ,剩余元素:$tail")case _ => println("Not match")}

这篇关于Scala 入门-提取器对象(match case)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1027142

相关文章

从入门到精通详解Python虚拟环境完全指南

《从入门到精通详解Python虚拟环境完全指南》Python虚拟环境是一个独立的Python运行环境,它允许你为不同的项目创建隔离的Python环境,下面小编就来和大家详细介绍一下吧... 目录什么是python虚拟环境一、使用venv创建和管理虚拟环境1.1 创建虚拟环境1.2 激活虚拟环境1.3 验证虚

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W

Java+AI驱动实现PDF文件数据提取与解析

《Java+AI驱动实现PDF文件数据提取与解析》本文将和大家分享一套基于AI的体检报告智能评估方案,详细介绍从PDF上传、内容提取到AI分析、数据存储的全流程自动化实现方法,感兴趣的可以了解下... 目录一、核心流程:从上传到评估的完整链路二、第一步:解析 PDF,提取体检报告内容1. 引入依赖2. 封装

Java使用正则提取字符串中的内容的详细步骤

《Java使用正则提取字符串中的内容的详细步骤》:本文主要介绍Java中使用正则表达式提取字符串内容的方法,通过Pattern和Matcher类实现,涵盖编译正则、查找匹配、分组捕获、数字与邮箱提... 目录1. 基础流程2. 关键方法说明3. 常见场景示例场景1:提取所有数字场景2:提取邮箱地址4. 高级

使用Java读取本地文件并转换为MultipartFile对象的方法

《使用Java读取本地文件并转换为MultipartFile对象的方法》在许多JavaWeb应用中,我们经常会遇到将本地文件上传至服务器或其他系统的需求,在这种场景下,MultipartFile对象非... 目录1. 基本需求2. 自定义 MultipartFile 类3. 实现代码4. 代码解析5. 自定

Java List 使用举例(从入门到精通)

《JavaList使用举例(从入门到精通)》本文系统讲解JavaList,涵盖基础概念、核心特性、常用实现(如ArrayList、LinkedList)及性能对比,介绍创建、操作、遍历方法,结合实... 目录一、List 基础概念1.1 什么是 List?1.2 List 的核心特性1.3 List 家族成

Python 字符串裁切与提取全面且实用的解决方案

《Python字符串裁切与提取全面且实用的解决方案》本文梳理了Python字符串处理方法,涵盖基础切片、split/partition分割、正则匹配及结构化数据解析(如BeautifulSoup、j... 目录python 字符串裁切与提取的完整指南 基础切片方法1. 使用切片操作符[start:end]2

使用Python提取PDF大纲(书签)的完整指南

《使用Python提取PDF大纲(书签)的完整指南》PDF大纲(Outline)​​是PDF文档中的导航结构,通常显示在阅读器的侧边栏中,方便用户快速跳转到文档的不同部分,大纲通常以层级结构组织,包含... 目录一、PDF大纲简介二、准备工作所需工具常见安装问题三、代码实现完整代码核心功能解析四、使用效果控

c++日志库log4cplus快速入门小结

《c++日志库log4cplus快速入门小结》文章浏览阅读1.1w次,点赞9次,收藏44次。本文介绍Log4cplus,一种适用于C++的线程安全日志记录API,提供灵活的日志管理和配置控制。文章涵盖... 目录简介日志等级配置文件使用关于初始化使用示例总结参考资料简介log4j 用于Java,log4c

史上最全MybatisPlus从入门到精通

《史上最全MybatisPlus从入门到精通》MyBatis-Plus是MyBatis增强工具,简化开发并提升效率,支持自动映射表名/字段与实体类,提供条件构造器、多种查询方式(等值/范围/模糊/分页... 目录1.简介2.基础篇2.1.通用mapper接口操作2.2.通用service接口操作3.进阶篇3