模式匹配-基础使用

40 阅读2分钟

(一)分析问题并解决

根据身份证号码,输出这个人的籍贯。例如:42表示湖北,33表示浙江,11表示北京,31表示上海。

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

package matchcase

object case01 {
  /*
  三大结构
  1.顺序结构
  2.选择结构:
          (1)if,if else if else;
          (2) match case
  3.循环结构
   */
  def main(args: Array[String]): Unit = {
    val code = "11"
    var province = ""

    if(code == "42"){
      province = "湖北" 
    } else  if(code == "11") {
      province ="北京"
    } else {
      province = "未知"
    }

  }

直接用 match case 来改造。

package matchcase

object case01 {
  /*
  三大结构
  1.顺序结构
  2.选择结构:
          (1)if,if else if else;
          (2) match case
  3.循环结构:
         (1)
   */
  def main(args: Array[String]): Unit = {
//    val code = "11"
//    var province = ""
//
//    if(code == "42"){
//      province = "湖北"
//    } else  if(code == "11") {
//      province ="北京"
//    } else {
//      province = "未知"
//    }

    val code = "11"
    val province = code match {
      case "42" => "湖北"
      case "11" => "北京"
      case _ => "未知"
    }

    println(s"${code} 对应的省份是:${province}")
  }
}

image.png

(二)match case的基本格式

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

通过例子来巩固下。

根据数值,输出对应的英文

package matchcase

object case02 {
  /*
  三大结构
  1.顺序结构
  2.选择结构:
          (1)if,if else if else;
          (2) match case
  3.循环结构:
         (2) for,
         (3) while, do...while
   */
  def main(args: Array[String]): Unit = {
    val num = "1"
    val word = num match {
      case "1" => "one"
      case "2" => "two"
      case "3" => "three"
      case "4" => "four"
      case "5" => "five"
      case _ => "other"
    }
  // 输入一个1-5的数字,打印它对应的英语单词。

    println(s"${num} 对应的英文是:${word}")
  }
}

image.png

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

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

package matchcase

object case03 {
  /*

  match case 高阶匹配
    1.匹配元组不同的数量

   */
  def main(args: Array[String]): Unit = {

    // 元组
    val t1 = (1,2)

    t1 match {
      case (a,b) => println(s"有二个元素${a},${b}")
      case _ => println("未知")
    }

    val arr1 = Array(10,2)

    arr1 match {
      case Array(1,x,y) => println("数组,第一个元素是1,长度为3")
      case Array(10,x) => println("数组,第一个元素是10,长度为2")
      case _ => println("其他")
    }
  }
}

image.png