模式匹配-基础使用

6 阅读2分钟

(一)、分析问题并解决

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

在java中有case语句,直接用 match case 来改造。

def main(args: Array[String]): Unit = {
  val code = 12
  val province = code match {
    case 42 => "湖北省"
    case 52 => "四川省"
    case _ => "未知"
  }
  println(province)
}

(二)、match case的基本格式

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

(1) 如果把case _ 放在前面会怎么样?

(2)如果省略了case _ 并且没有匹配到的内容,会怎么样?

def main(args: Array[String]): Unit = {
  // 输入1,输出单词one
  // 输入2,输出单词two
  // 输入3,输出单词three
  // 输入其他,输出单词other

  //1.如果能精准匹配成功,就会执行后面的代码
  //2.case _ 它表示可以匹配任意的内容。一定要放在matchcase的最后一条
  //3.case _ 不能省略:如果匹配不成功,就会报错。

  //1.从键盘获取数字
  val code = 10
  //2.使用matchcase进行匹配
  code match {
    case 1 => println("one")
    case 2 => println("two")
    case _ => println("未知")
  }
}

(三)、高阶匹配之元组元素数量

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

/**
 * match case
 * 1.匹配精确值
 * 2.匹配数据类型
 * 3.匹配元素的个数
 */

object matchcase03 {

  def processNum(value:Any):Unit = {
    value match {
      case (a,b,c) => println(s"三个元素的元祖,第一个元素是${a}")
      case (x,y) => println("两个元素的元祖")
      case _ =>println("其他")
    }
  }

  def main(args: Array[String]): Unit = {
//    val obj = 10
//    processValue(obj)
    processNum((1,2))
    processNum((1,2,3))


  }
}