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