匹配数组、列表、元组(集合个数的匹配)
1、匹配数组
Array(0) 匹配只有一个元素且为0的数组。
Array(x,y) 匹配数组有两个元素,并将两个元素赋值为x和y。
Array(0,_*) 匹配数组以0开始
// 1.值匹配、2.值匹配添加守卫、3类型匹配、4.集合的个数匹配
for (arr <- Array(Array(0), Array(1, 0), Array(0, 1, 0), Array(1, 1, 0), Array(0, 1, 0, 1), Array(1, 1, 0, 1))) {
val result = arr match {
case Array(0) => "0"
case Array(x, y) => x + " " + y + " 两个元素匹配"
case Array(x, y, z) => x + " " + y + " " + z + " 三个元素匹配"
case Array(0, _*) => "0..." + " 以0开头 多个元素匹配"
case _ => "something else"
}
println(result)
}
Array 伴生对象就是一个提取器,它定义了一个unapplySeq方法,该方法被调用时,以被执行匹配动作的表达式作为参数,而不是模式中看上去像是参数的表达式,对Array.unapplySeq(arr)的调用如果成功,结果是一个序列的值,即数组中的值。在第一个case中,如果数组长度为2,而第二个元素为零的话,匹配成功,这时,数组中的第一个元素被赋值给X, 这里简单提一下,下一小节中,我们会讲解提取器
2、匹配列表
与匹配数组相似,同样可以应用于列表
for (lst <- Array(List(0), List(1, 0), List(0, 0, 0), List(1, 0, 0))) {
val result = lst match {
case 0 :: Nil => "0"
case x :: y :: Nil => x + " " + y
case 0 :: tail => "0 ..."
case _ => "something else"
}
println(result)
}
3、匹配元组
同样可以应用于元组
println("match 匹配元组")
for (pair <- Array((0, 1), (1, 0), (1, 1))) {
val result = pair match {
case (0, _) => "0 ..."
case (y, 0) => y + " 0"
case _ => "neither is 0"
}
println(result)
}