模式匹配-基本使用

30 阅读2分钟

分析问题并解决

根据一个值输出另一个与之对应的值,很容易就想到if else

match case的基本格式

高阶匹配之元组元素数量

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

match case 的用法

  • 1、类似 if else 这种多分支选择结构,精确匹配值
  • 2、1.case _ 是可选的:如果匹配不成功,又没有case _,程序会报错 2.case _ 必须要放在最后。
  • 3、匹配类型
  • (2)匹配元组类型 -(3)匹配元组类型 -(4)匹配元组类型 (5)样例类及其属性
object MatchCase {
  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 _ => "未知"
    }
  }
}
object matchcase02 {
  def main(args: Array[String]): Unit = {
    val xiaohong = (100, 100, 100)
    val xiaoming = (99, 98)

    getScore(xiaohong)
    getScore(xiaoming)
    getScore(1,2,3,4)
  }

  def getScore(score: Any): Unit = {
    score match {
      case (a, b, c) => println("元组中有三个元素: a =" + a +" b = "+b+" c = "+c)
      case (a, b) => println("元组中有两个元素:  a =" + a +" b = "+b)
      case _ => println("未知")
    }
  }
}
object matchexam3 {
  def main(args: Array[String]): Unit = {
    testType(1)
    testType(1.1)
    testType("1")
  }

  def testType(i:Any): Unit = {
    i match {
      case x:Int => println("当前类型是: Int")
      case x:Double => println("当前类型是: Double")
      case _ => println("未知")
    }
  }
}
object matchcase05 {
  // 定义一个样例类:圆形,它有一个属性:半径
  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")
  }
}