scala 中的 match case 模式匹配

36 阅读2分钟

在编程世界中,选择结构是我们每天都要面对的基础工具。但Scala的match-case模式匹配,将这一基础工具提升到了艺术的高度,让代码既简洁又强大。

第一式:基础匹配,替代繁琐的 If-Else

首先,最简单的用法就是替代 if-else,处理简单的键值映射。

package matchcase

object case01 {
  /*三大结构
  顺序 选择
  (1)if,if else  if else:
  (2)match case
  match case
  循环结构
  for ,while, do...while

  */
  def main(args: Array[String]): Unit = {
//    val code = "42"
//    var province = ""
//    if(code == "42" ) {
//      province = "湖北"
//    } else if(code == "11") {
//      province = "北京"
//    } else {
//      private = "未知"
//    }
//
//
    val code = "11"
    val province = code match {
      case "42" => "湖北"
      case "11" => "北京"
      case _  => "未知"
    }
    println(s"${code} 对应的省份是:${province}")
  }

}

第二式:类型匹配与用户交互

match-case 不仅能匹配字符串,还能匹配数字、甚至类型。我们可以结合 scala.io.StdIn 来做一个简单的交互式程序。

package matchcase

import scala.io.StdIn

object case012 {
  /*三大结构
  顺序 选择
  (1)if,if else  if else:
  (2)match case
  match case
  循环结构
  for ,while, do...while

   */
  def main(args: Array[String]): Unit = {
    // 1. 提示用户输入,并读取控制台输入的数字(转为Int类型)
    println("请输入一个1-5之间的整数:")
    val num = StdIn.readInt()

    // 2. 使用match case模式匹配,匹配数字对应的英文单词
    val englishWord = num match {
      case 1 => "one"
      case 2 => "two"
      case 3 => "three"
      case 4 => "four"
      case 5 => "five"
      // 处理非1-5的输入,避免匹配失败报错
      case _ => "输入错误!请输入1-5之间的整数"
    }

    // 3. 正确使用字符串插值输出结果(修复你代码中的插值错误)
    println(s"${num} 对应的英文是:${englishWord}")
  }
}

第三式:高阶玩法——结构化模式匹配

这才是 match-case 真正的特性

package matchcase

import scala.io.StdIn

object case013 {
  /*
  match case 高阶匹配
  1.匹配元组不同的数量
  2.匹配数组特殊值

   */
  def main(args: Array[String]): Unit = {
    //元组
    val t1  = (2,3)
    val t2  = (2,3,4)
    val t3 = (2,3,5,6)
    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("其他")
    }
  }
}

总结

通过这三个例子,我们可以看到 Scala 的 match-case 远比 Java 的 switch 强大:

1. 全能: 它可以匹配值、类型、null 以及复杂的结构(数组、元组、列表)。

2. 数据解构: 它不仅能判断“是不是”,还能把数据里的内容“掏出来”用。

3.代码洁癖: 使用 match-case 可以大大减少 if-else 的嵌套,让逻辑一目了然。