37 模式匹配-基础使用

32 阅读3分钟

一. match case的基本格式

格式如下:

value match {

  case pattern1 => result1

  case pattern2 => result2

...

  case patternN => resultN

case _ => 其他

}

执行流程是:如果value匹配到了pattern1,就执行结果1,如果都没有匹配到,就执行 _ 对应的内容。

def main(args: Array[String]): Unit = {
  println(getProvinceName(11))
  println(getProvinceName(42))
  println(getProvinceName(12))
}

def getProvinceName(code:Int):String = {
  code match {
    case 42 => "湖北"
    case 11 => "北京"
    case _ => "未知"
  }

}

结果如图:

image.png

注意:

  1. case _ 是必不可少的:如果匹配不成功,又没有case _,程序会报错
  2. case _ 必须要写在最后。

二. 高阶匹配之元组元素数量

前面的匹配都是精准匹配:变量和值是相等的。但是呢,scala中的模式匹配的规则是非常强大的,不一定是精准的匹配值,还可以根据元组的元素的个数来匹配。

def main(args: Array[String]): Unit = {
  val xiaoming = (100,100,100)
  val xiaohong = (80,98)
  getScore(xiaoming)
  getScore(xiaohong)
  getScore((1,2,3,4))
}

def getScore(score:Any): Unit = {
  score match {
    case (a,b,c) => println(s"元组中有三个元素: a = ${a} b = ${b} c = ${c}")
    case (a,b) => println(s"元组中有两个元素: a = ${a} b = ${b}")
    case _ => println("不匹配")
  }
}

结果如图:

image.png

三. 高阶匹配之变量类型匹配

除了格式匹配之外,还可以对变量的类型进行匹配。

格式如下:

对象名 match {

    case 变量名1:类型1  => 表达式1
case 变量名2:类型2  => 表达式2
case 变量名3:类型3  => 表达式3

    // 其他case语句...
casee _ => 表达式

}

如果变量名没有被使用到,可以使用_代替。

def main(args: Array[String]): Unit = {
  testType(1)
  testType(1.1)
  testType("11")
}

def testType(i:Any):Unit = {
  i match {
    case _:Int => println("当前类型是: Int")
    case _:Double => println("当前类型是: Double")
    case _ => println("未知")
  }
}

结果如图:

image.png

四. 高阶匹配之匹配元素特征

模式匹配还可以根据数组元素的个数,元素的特征来匹配。

格式如下:

数组 match {

case Array(1,x,y) => 匹配到数组,长度为3,且第一个元素为1
case Array(0) =>匹配到数组:长度为1,且只有一个元素0
case Array(1,_*) =>匹配到数组:长度为n,第一个元素为1

case _ => 其他

}

def main(args: Array[String]): Unit = {
  testType(Array(1,2,3))
  testType(Array(1,2,3,4))
  testType(Array(1,2,3,4))
  testType(Array(11,1,3,4))
}

def testType(arr:Any):Unit = {
  arr match {
    case Array(1,x,y) => println("arr是一个数组,有三个元素,第一个是1")
    case Array(1,x,y,z) => println("arr是一个数组,有四个元素,第一个是1")
    case Array(x,1,y,z) => println("arr是一个数组,有四个元素,第二个是1")
    case _ => println("未知")
  }
}

结果如图:

image.png

六. 高阶匹配之匹配案例类

模式匹配还根据案例类的不同,匹配不同的案例类和其中的字段信息。

格式如下:

对象 match {

case 样例类类型1(字段1,字段2)=> 表达式

case 样例类类型2(字段1,字段2,字段3)=> 表达式

case _ => 其他

}

注意: 样例类1中的字段个数要与之对应。

// 定义一个样例类:圆形。它有一个属性:半径
case class Circle(radius:Double)
// 定义一个样例类:矩形。它有两个属性:长和宽
case class Rectangle(width:Double, height:Double)

// 定义一个方法,用来求圆,矩形的面积
def getArea(obj:Any):Unit = {
  obj match {
    case Circle(radius) => println("圆形的面积是: " + radius * radius * 3.14)
    case Rectangle(width, height) => println("矩形的面积是: " + width * height)
    case _ => println("未知")
  }
}

def main(args: Array[String]): Unit = {
  getArea(Circle(2))
  getArea(Rectangle(2,3))
  getArea("abc")
}

结果如图:

image.png