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在Excel中插入、修改、提取和删除超链接

《使用Python在Excel中插入、修改、提取和删除超链接》超链接是Excel中的常用功能,通过点击超链接可以快速跳转到外部网站、本地文件或工作表中的特定单元格,有效提升数据访问的效率和用户体验,这... 目录引言使用工具python在Excel中插入超链接Python修改Excel中的超链接Python

C#从XmlDocument提取完整字符串的方法

《C#从XmlDocument提取完整字符串的方法》文章介绍了两种生成格式化XML字符串的方法,方法一使用`XmlDocument`的`OuterXml`属性,但输出的XML字符串不带格式,可读性差,... 方法1:通过XMLDocument的OuterXml属性,见XmlDocument类该方法获得的xm

JSON字符串转成java的Map对象详细步骤

《JSON字符串转成java的Map对象详细步骤》:本文主要介绍如何将JSON字符串转换为Java对象的步骤,包括定义Element类、使用Jackson库解析JSON和添加依赖,文中通过代码介绍... 目录步骤 1: 定义 Element 类步骤 2: 使用 Jackson 库解析 jsON步骤 3: 添

C#提取PDF表单数据的实现流程

《C#提取PDF表单数据的实现流程》PDF表单是一种常见的数据收集工具,广泛应用于调查问卷、业务合同等场景,凭借出色的跨平台兼容性和标准化特点,PDF表单在各行各业中得到了广泛应用,本文将探讨如何使用... 目录引言使用工具C# 提取多个PDF表单域的数据C# 提取特定PDF表单域的数据引言PDF表单是一

C#实现添加/替换/提取或删除Excel中的图片

《C#实现添加/替换/提取或删除Excel中的图片》在Excel中插入与数据相关的图片,能将关键数据或信息以更直观的方式呈现出来,使文档更加美观,下面我们来看看如何在C#中实现添加/替换/提取或删除E... 在Excandroidel中插入与数据相关的图片,能将关键数据或信息以更直观的方式呈现出来,使文档更

Spring常见错误之Web嵌套对象校验失效解决办法

《Spring常见错误之Web嵌套对象校验失效解决办法》:本文主要介绍Spring常见错误之Web嵌套对象校验失效解决的相关资料,通过在Phone对象上添加@Valid注解,问题得以解决,需要的朋... 目录问题复现案例解析问题修正总结  问题复现当开发一个学籍管理系统时,我们会提供了一个 API 接口去

Java后端接口中提取请求头中的Cookie和Token的方法

《Java后端接口中提取请求头中的Cookie和Token的方法》在现代Web开发中,HTTP请求头(Header)是客户端与服务器之间传递信息的重要方式之一,本文将详细介绍如何在Java后端(以Sp... 目录引言1. 背景1.1 什么是 HTTP 请求头?1.2 为什么需要提取请求头?2. 使用 Spr

Java如何通过反射机制获取数据类对象的属性及方法

《Java如何通过反射机制获取数据类对象的属性及方法》文章介绍了如何使用Java反射机制获取类对象的所有属性及其对应的get、set方法,以及如何通过反射机制实现类对象的实例化,感兴趣的朋友跟随小编一... 目录一、通过反射机制获取类对象的所有属性以及相应的get、set方法1.遍历类对象的所有属性2.获取

使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加

Java中switch-case结构的使用方法举例详解

《Java中switch-case结构的使用方法举例详解》:本文主要介绍Java中switch-case结构使用的相关资料,switch-case结构是Java中处理多个分支条件的一种有效方式,它... 目录前言一、switch-case结构的基本语法二、使用示例三、注意事项四、总结前言对于Java初学者