1 匹配数组
1)Array(0) 匹配只有一个元素且为0的数组。
2)Array(x,y) 匹配数组有两个元素,并将两个元素赋值为x和y。当然可以依次类推Array(x,y,z) 匹配数组有3个元素的等等....
3)Array(0,_*) 匹配数组以0开始
应用案例
2 匹配列表
应用案例
for (list <- Array(List(0), List(1, 0), List(0, 0, 0), List(1, 0, 0))) { val result = list match { case 0 :: Nil => "0" // case x :: y :: Nil => x + " " + y // case 0 :: tail => "0 ..." // case _ => "something else" } println(result) }
3 匹配元组
应用案例
// 元组匹配// 元组匹配 for (pair <- Array((0, 1), (1, 0), (1, 1),(1,0,2))) { val result = pair match { // case (0, _) => "0 ..." // case (y, 0) => y // case _ => "other" //. } println(result) }
4 对象匹配
对象匹配,什么才算是匹配呢?,规则如下:
1)case中对象的unapply方法(对象提取器)返回Some集合则为匹配成功
2)返回none集合则为匹配失败
应用案例1
object Square { def unapply(z: Double): Option[Double] = Some(math.sqrt(z)) def apply(z: Double): Double = z * z } // 模式匹配使用: val number: Double = 36.0 number match { case Square(n) => println(n) case _ => println("nothing matched")
应用案例1的小结
1)构建对象时apply会被调用 ,比如 val n1 = Square(5)
2)当将 Square(n) 写在 case 后时[case Square(n) => xxx],会默认调用unapply 方法(对象提取器)
3)number 会被 传递给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") // 打印字符串 println(s"$first $second $third") } case _ => println("nothing matched") }