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

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

开发者学堂课程【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)其它的规则不变.

相关文章
|
开发框架 .NET C#
c#数组补充
c#数组的几个简单的补充
45 0
|
6月前
|
Java 程序员
JavaSE——正则表达式(2/2):应用案例、查找信息、用于搜索替换、分割内容
JavaSE——正则表达式(2/2):应用案例、查找信息、用于搜索替换、分割内容
30 0
|
7月前
|
Java 索引
正则表达式源码分析--三个常用类--分组、捕获、反向引用--String 类中使用正则表达式的代码示例和图
正则表达式源码分析--三个常用类--分组、捕获、反向引用--String 类中使用正则表达式的代码示例和图
88 0
|
Java API 数据安全/隐私保护
字符串讲解以及一些基础案例的练习
字符串讲解以及一些基础案例的练习
71 0
|
前端开发
前端学习案例3-this指向问题-隐式调用规则
前端学习案例3-this指向问题-隐式调用规则
79 0
前端学习案例3-this指向问题-隐式调用规则
|
前端开发
前端学习案例4-this指向问题-隐式调用规则2
前端学习案例4-this指向问题-隐式调用规则2
75 0
前端学习案例4-this指向问题-隐式调用规则2
|
前端开发
前端学习案例9-正则-非捕获反向引用
前端学习案例9-正则-非捕获反向引用
72 0
前端学习案例9-正则-非捕获反向引用
|
存储 Java
定义不可变对象的策略---粗略翻译自文档
定义不可变对象的策略---粗略翻译自文档
定义不可变对象的策略---粗略翻译自文档
|
Scala 开发者
类型匹配的基本介绍和使用 | 学习笔记
快速学习类型匹配的基本介绍和使用
类型匹配的基本介绍和使用 | 学习笔记
|
JavaScript 网络架构
ES6知识点补充——剩余参数、展开语法
JS查漏补缺系列是我在学习JS高级语法时做的笔记,通过实践费曼学习法进一步加深自己对其的理解,也希望别人能通过我的笔记能学习到相关的知识点。这一次我们来了解剩余参数、展开语法
194 0