对象匹配的应用案例 | 学习笔记

简介: 快速学习对象匹配的应用案例

开发者学堂课程【Scala 核心编程 - 进阶对象匹配的应用案例学习笔记,与课程紧密连接,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/610/detail/9077


对象匹配的应用案例


应用案例

本节继续讲解对象匹配的应用案例,先对上节案例进行小结:

(1)构建对象时apply会被调用,比如val n1 = Square(5)

(2)当将Square(n)写在case后时[case Square(n) => xxx],会默认调用unapply方法(对象提取器)

(3)nuber会被传递给def unapply(z: Double)的z形参

(4)如果返回的是Some集合,则unapply提取器返回的结果会返回给n这个形参

(5)case中对象的unapply方法(提取器)返回Some集合则为匹配成功

(6)返回none集合则为匹配失败

应用案例2

object Names {

def unapplySeq(str: String): Option[Seq[String]]={

if (str.contains(“,")) Some(str.split(“,”))

else None

}}

val namesString = "Alice,Bob,Thomas"

//说明

namesString match {

case Names(first,second, third) =>{

println("the string contains three people's names")

//打印字符串

printin(s”$first $second $third")

}

case_=> printin("nothing matched")

}

上述代码添加了 unapplySeq,因为第一个案例返回时对应的构造形参只有一个,我们使用的是 unapply,但是构建对象时可能传入好多参数。unapplySeq 返回的是序列,Option[Seq[String]]中返回的是多个。

举一个例子 Alice、Bob、Thomas,调用 unapplySeq 方法返回 Some 三个值,Some(“”,””,””)中的三个值就分别返回给 first;second,third。

来演示:创建一个 Scala Class名为MatchObjectDemo2

代码完整如下:

package com.atguigu.chapter12

Object MatchObjectDemo2 {

def main (args:Array[String]):Unit = {

val namesString = "Alice,Bob,Thomas"  //字符串

//说明

namesString match {

//当执行case Names(first,second, third)

//1.会调用unapplySeq(str),把”Alice,Bob,Thomas”传入给str

//2.如果返回的是Some(“Alice”,”Bob”,”Thomas”),分别给(first,second, third)

//  注意,这里的返回的值的个数需要和(first,second, third)要一样

//3.如果返回的None,表示匹配失败

case Names(first,second, third) =>{

println("the string contains three people's names")

//打印字符串

printin(s”$first $second $third")

}

case_=> printin("nothing matched")

}

}

}

//object

object Names {

//当构造器是多个参数时就会触发这个对象提取器

def unapplySeq(str: String): Option[Seq[String]]={

if (str.contains(“,")) Some(str.split(“,”))

else None

}}

运行,结果显示

Alice Bob Thomas

下面我们将个数改为不一致,修改代码:

case Names(first,second)

printin(s”$first $second")

再来运行查看结果,结果显示

nothing matched

再来修改字符串中没有”,”,修改代码:

val namesString = "AliceBobThomas"

运行查看结果,结果显示

nothing matched

应用案例2的小结

1)当case后面的对象提取器方法的参数为多个,则会默认调用def unapplySeq()方法

2)如果unapplySeq返回是Some,获取其中的值,判断得到的sequence中的元素的个数是否是三个,如果是三个,则把三个元素分别取出,赋值给first,second和third(不一定名字为first,second和third,可以自定义abc等)

3)其它的规则不变.

相关文章
|
前端开发 Java 关系型数据库
【实训项目】you书-校园二手书交易APP
【实训项目】you书-校园二手书交易APP
1034 0
|
前端开发
CSS中的边框属性:border、border-width、border-color、border-style 详解
CSS中的边框属性:border、border-width、border-color、border-style 详解
1470 44
|
分布式计算 负载均衡 API
微服务架构设计原则与模式
【8月更文第29天】随着云计算和分布式计算的发展,微服务架构已成为构建大型复杂应用的一种流行方式。这种架构模式将单个应用程序分解成一组小型、独立的服务,每个服务运行在其自己的进程中,并通过轻量级机制(通常是HTTP资源API)进行通信。本文将探讨微服务架构的基本设计原则、常用模式以及如何有效地划分服务边界。
950 3
|
Web App开发 测试技术 项目管理
【Docker项目实战】使用Docker部署Servas自托管书签管理工具
【6月更文挑战第5天】使用Docker部署Servas自托管书签管理工具
449 1
【Docker项目实战】使用Docker部署Servas自托管书签管理工具
|
机器学习/深度学习 数据采集 算法
Python实现DBSCAN膨胀聚类模型(DBSCAN算法)项目实战
Python实现DBSCAN膨胀聚类模型(DBSCAN算法)项目实战
|
机器学习/深度学习 传感器 自动驾驶
探究自动驾驶技术:原理、概念
本文探讨了自动驾驶技术,其核心包括感知系统、数据处理与决策及控制系统。技术分为SAE定义的6个自动化级别,涉及规则与机器学习方法,以及车辆间通信。挑战包括安全性、法律道德问题和基础设施改造。未来,自动驾驶有望提升交通安全性、效率,改善出行体验并促进环保交通。
|
网络协议 Linux 网络安全
如何实现无公网ip远程SSH连接家中本地的树莓派
如何实现无公网ip远程SSH连接家中本地的树莓派
222 0
|
编解码
🖥️Electron实现录屏软件(二)——指定区域录制
🖥️Electron实现录屏软件(二)——指定区域录制
|
JSON 前端开发 Java
Spring Boot之Controller控制器:实现Web请求处理与业务逻辑分离
本篇详细介绍了Spring Boot中的Controller控制器的作用、用法和最佳实践。Controller是负责处理Web请求和响应的核心组件,能够将前端的HTTP请求映射到相应的业务逻辑处理,并返回适当的响应。通过一个简单的示例,展示了如何创建和配置Controller,并使用不同类型的注解来映射请求。还介绍了如何处理请求参数、路径变量,并展示了Controller方法返回不同类型的数据和视图的方式。通过学习本文内容,读者可以更好地理解和使用Spring Boot中的Controller,从而构建出灵活、高效的Web应用,提供优质的用户体验。
2988 2
HarmonyOS初探06——使用DevEco Studio模拟器端口被占用无法启动
在内网环境下首次使用DevEco Studio创建应用时,可能会报如下问题: server not running; starting it at tcp:5037
475 0
HarmonyOS初探06——使用DevEco Studio模拟器端口被占用无法启动