(1)高阶匹配之变量类型匹配
除了格式匹配之后,还可以对变量的类型进行匹配。 如果变量名没有被使用到,可以使用_代替。 例如: _:Int =>
需求:
1.定义一个变量为Any类型,然后分别给它赋值不同的类型的数据。
2.对这个变量做模式匹配
(2)高阶匹配之匹配数组
模式匹配还可以根据数组元素的个数,元素的特征来匹配。
[例如如下的格式]:
数组 match {
case Array(1,x,y) => 匹配到数组,长度为3,且第一个元素为1
case Array(0) =>匹配到数组:长度为1,且只有一个元素0
case Array(1,_*) =>匹配到数组:长度为n,第一个元素为1
case _ => 其他
}
package matchcase
/*
* match case
* 1.匹配精确值
* 2.匹配数据类型
* 3.匹配元素的个数
* 4.匹配数组元素个数,元素特征
* */
object matchcase04 {
def mathArray(arr:Any):Unit ={
arr match {
case Array(x, y) => println("匹配到有两个元素的数组",x,y)
case Array(1,b,c) => println("匹配到有三个元素的数组,第一个元素是1")
case Array(a,b,c) => println("匹配到有三个元素的数组",a,b,c)
case Array(10, _*) => println("第一个元素是10,元素的个数有任意个")
case _ => println("没有匹配到")
}
}
def main(args: Array[String]): Unit = {
val arr1 = Array(1,2,3)
val arr2 = Array(2,2,3)
val arr3 = Array(10,2,3,1)
mathArray(arr1)
mathArray(arr2)
mathArray(arr3)
}
}
(3)高阶匹配之匹配案例类
模式匹配还根据案例类的不同,匹配不同的案例类和其中的字段信息。
[例如格式]:
对象 match {
case 样例类类型1(字段1,字段2)=> 表达式
case 样例类类型2(字段1,字段2,字段3)=> 表达式
case _ => 其他
}
注意:样例类1中的字段个数要与之对应。
package matchcase
/*
* match case
* 1.匹配精确值
* 2.匹配数据类型
* 3.匹配元素的个数
* 4.匹配数组元素个数,元素特征
* 5.匹配案例类
* */
object matchcase05 {
case class Circle(r:Double)
case class Rectangle(w:Double,h:Double)
def calculateArea(shape:Any):Double ={
shape match {
case Circle(r) => 3.14 * r * r
case Rectangle(w,h) => w * h
case _ => 0.0
}
}
def main(args: Array[String]): Unit = {
val circle = Circle(2.0)
val rectangle =Rectangle(2.0, 3.0)
println(calculateArea(circle))
println(calculateArea(rectangle))
}
}
【注】:当传入Circle类型时,匹配case Circle(r)并按照圆的面积公式计算;当传入Rectangle类型时,匹配case Rectangle(w, h)并按照矩形面积公式计算。
(4)变量声明中的模式匹配
package matchcase
/*
* match case
* 1.匹配精确值
* 2.匹配数据类型
* 3.匹配元素的个数
* 4.匹配数组元素个数,元素特征
* 5.匹配案例类
* 6.变量声明时的匹配
* */
object matchcase06 {
def main(args: Array[String]): Unit = {
val arr = Array(1,2,3,4,5)
// 定义3个变量:x,y,z 保存数组中的前三个元素的值
// val x = arr(0)
// val y = arr(1)
// val z = arr(2)
val Array(x,y,z, _*) = arr
println(x,y,z)
}
}
其中: _*表示多个其他的元素值。