scala 模式匹配:不仅仅是 switch-case

36 阅读3分钟

一、模式匹配

模式匹配(Pattern Matching)是Scala中一个极其强大的特性,它不仅超越了传统语言的switch-case语句,更是将函数式编程的优雅与面向对象的灵活性完美结合。让我们从基础开始,逐步深入。

二、基础篇:类型匹配

package matchcase

object case014 {
  /*
  match case 高阶匹配
  1.匹配元组不同的数量
  2.匹配数组特殊值
  3.匹配变量的类型
  a:Int = 1;

   */
  def matchType(value:Any):Unit = {
    value match {
      case x:Int => println(s"${x} 是Int")
      case x:Double => println(s"${x} 是Double")
      case _ => println("未知")
    }
  }
  def main(args: Array[String]): Unit = {
    matchType(1)
    matchType(1.1)

    }
  }

三、实战篇:几何图形计算

在这个例子中,我们定义了两个样例类 Circle(圆形)和 Rectangle(矩形),并编写了一个 getArea 方法来计算不同图形的面积。

package matchcase

object case015 {
  /*
  match case 练习匹配
  1. 匹配指定不同的元素的数量
  2. 匹配进行值传递
  3. 匹配类型的类型
  4. 匹配样例类
  */

  // 1. 圆形类
   case class Circle(radius: Double) {}
  // 2. 矩形类
   case class Rectangle(width: Double, height: Double) {}

  // 封装一个求面积的方法
  def getArea(shape: Any): Double = {
    shape match {
      case Circle(radius) => math.Pi * radius * radius
      case Rectangle(width, height) => width * height
      case _ => 0.0
    }
  }

  def main(args: Array[String]): Unit = {
    // 1. 实例化圆形对象
    val circle = Circle(2.0)
    // 2. 实例化矩形对象
    val rectangle = Rectangle(2.0, 3.0)
    println(getArea(circle))
    println()
  }
}

四、集合操作篇:Map的高级匹配

代码中有一个包含互联网大佬姓名和出生年份的 Map。我们的需求是找出所有 1983 年出生的人。

package matchcase

object case016 {

  def main(args: Array[String]): Unit = {
    val m1 = Map(
      "马云 - 阿里巴巴" -> 1994,
      "马化腾 - 腾讯" -> 1971,
      "李彦宏 - 百度" -> 1968,
      "雷军 - 小米" -> 1990,
      "丁磊 - 网易" -> 1971,
      "张一鸣 - 字节跳动" -> 1983,
      "刘强东 - 京东" -> 1974,
      "程维 - 滴滴" -> 1983,
      "王兴 - 美团" -> 1979,
      "史玉柱 - 360" -> 1979,
      "黄峥 - 拼多多" -> 1980,
      "李想 - 理想汽车" -> 1981,
      "何小鹏 - 小鹏汽车" -> 1977,
      "蔡跃亭 - 乐视" -> 1973,
      "陈天桥 - 盛大网络" -> 1973,
      "顾颖 - 知乎" -> 1988,
      "王小川 - 搜狗" -> 1978
    )

    // 请在m1这个map中,找出所有出生年份大于1970的人名,并打印出来
    for ((key, 1983) <- m1) {
      println(key)

    }
    for ((key, value) <- m1) {
      if (value == 1983)
        println(key)
    }

  }
}

五、数组解构篇:优雅的数组操作

给定一个数组,我们需要定义三个变量分别代表前三个元素。

package matchcase

object case017 {
  def main(args: Array[String]): Unit = {
   //定义一个数组,其中有四个元素
    val arr = Array(11, 22, 33, 4,5,6)
    //需求:补充定义三个变量 x,y,z,分别表示数组中第一个元素、第二个元素、第三个元素
//    val x = arr(0)
//    val y = arr(1)
//    val z = arr(2)
//    println("x=" + x + " y=" + y + " z=" + z)
    //优化:使用match-case表达式完成上述需求
    val Array(x, y, z,_*) = arr
    println("x=" + x + " y=" + y + " z=" + z)
  }
}