内容如下:
1.高阶匹配之变量类型匹配
2.高阶匹配之匹配案例类
3.匹配for表达式
4.变量声明中的模式匹配
(五)高阶匹配之变量类型匹配
除了格式匹配之后,还可以对变量的类型进行匹配。
格式如下:
对象名 match {
case 变量名1:类型1 => 表达式1
case 变量名2:类型2 => 表达式2
case 变量名3:类型3 => 表达式3
// 其他case语句...
casee _ => 表达式
}
如果变量名没有被使用到,可以使用_代替。 例如: _:Int =>
案例需求: 1.定义一个变量为Any类型,然后分别给它赋值不同的类型的数据。
2.对这个变量做模式匹配
【代码如下】
package matchcase
object case04 {
/*
* match case 高阶匹配
* 1.匹配元组不同的元素的数量
* 2.匹配数组特殊值
* 3.匹配变量的类型
*
a:Int = 1;
**/
def matchType(value:Any): Unit = {
value match {
case x:Int => println(s"${x} 是Int")
case x:Double => println(s"${x} 是Double")
case _ => println("未知")
}
}
def main(args: Array[String]): Unit = {
matchType(1)
matchType(1.1)
}
}
【运行结果】
(六)高阶匹配之匹配案例类
模式匹配还根据案例类的不同,匹配不同的案例类和其中的字段信息。例如格式:
对象 match {
case 样例类类型1(字段1,字段2)=> 表达式
case 样例类类型2(字段1,字段2,字段3)=> 表达式
case _ => 其他
}
【代码如下】
package matchcase
object case05 {
/*
* match case 高阶匹配
* 1.匹配元组不同的元素的数量
* 2.匹配数组特殊值
* 3.匹配变量的类型
* 4.匹配样例类
**/
// 1.圆形类
case class Circle(radius: Double) {}
// 2.矩形类
case class Rectangle(width: Double, height:Double) {}
// 封装一个求面积的方法
def getArea(shape: Any): Double = {
shape match {
case Circle(radius) => math.Pi * radius * radius
case Rectangle(width, height) => width * height
case _ => 0.0
}
}
def main(args: Array[String]): Unit = {
// 1. 实例化圆形对象
val circle = Circle(2.0)
// 2. 实例化矩形对象
val rectangle = Rectangle(2.0, 3.0)
println(getArea(circle))
println(getArea(rectangle))
}
}
【运行结果】
(七)匹配for表达式
【案例】: 从Map中打印所有年龄为1983的创业者的信息。
【代码如下】
package matchcase
object case06 {
def main(args: Array[String]): Unit = {
val m1 = Map(
"马云 - 阿里巴巴" -> 1964,
"马化腾 - 腾讯" -> 1971,
"李彦宏 - 百度" -> 1968,
"雷军 - 小米" -> 1969,
"丁磊 - 网易" -> 1971,
"张一鸣 - 字节跳动" -> 1983,
"刘强东 - 京东" -> 1974,
"程维 - 滴滴" -> 1983,
"王兴 - 美团" -> 1979,
"周鸿祎 - 360" -> 1970,
"黄峥 - 拼多多" -> 1980,
"李想 - 理想汽车" -> 1981,
"何小鹏 - 小鹏汽车" -> 1977,
"贾跃亭 - 乐视" -> 1973,
"陈天桥 - 盛大网络" -> 1973,
"周源 - 知乎" -> 1980,
"王小川 - 搜狗" -> 1978
)
// 请在m1这个Map,找出所有1983年出生的企业家
for((key,1983) <- m1){
println(key)
}
for((key,value) <- m1){
if(value == 1983)
println(key)
}
}
}
【运行结果】
(八)变量声明中的模式匹配
案例需求:现在有一个数组Array(11, 22, 33, 4 , 5 , 6),我希望能定义三个变量,它们的值分别是数组中的第1,2,3个元素的值。
【代码如下】
package matchcase
object case07 {
def main(args: Array[String]): Unit = {
// 定义一个数组,其中有4个元素
val arr = Array(11, 22, 33, 4 , 5 , 6)
// 需求:补充定义三个变量x,y,z,分别保持数组arr中的第1,2,3个元素的值。
// var x = arr(0)
// var y = arr(1)
// var z = arr(2)
//
// println("x* x + y* y + z* z")
// 优化:使用match-case表达式,完成上述需求
val Array(x,y,z,_*) = arr
println("x=" + x + ",y=" + y + ",z=" + z)
}
}
【运行结果】
其中: _*表示多个其他的元素值。