Scala 的 模式匹配

让我们来回顾一下如何输入身份证前两位:

Scala 复制代码
        //    val id = "429005202023210042"
    //    val id = "319005202023210042"
    //    val id = "119005202023210042"
        val id = "339005202023210042"

第一种方法:

Scala 复制代码
    //预习
    val pre = id.substring(0, 2).toInt
    if (pre == 42) {
      println("湖北")
    } else if (pre == 33) {
      println("浙江")
    }else if (pre == 11){
      println("北京")
    }else if (pre == 31){
      println("上海")
    }else{
      println("其他")
    }

第二种方法:模式匹配

Scala 复制代码
    //模式匹配
    //截取前两位
    val pre = id.substring(0,2).toInt

    pre match {
      case 42 => println("湖北")
      case 33 => println("浙江")
      case 11 => println("北京")
      case _ => println("其他")
      //细节一: case _ 的位置   一定要放在最后
      //细节二: case _ 不写    如果没有正确的匹配项,报错
    }

什么是模式匹配?

模式匹配格式如下:

Scala 复制代码
package ob9

object ob9_1 {
  def main(args: Array[String]): Unit = {
    //从数据库中获取1,2,3,4
    //要显示给用户的是    一等,二等,三等
    val level = 6
    val levelTxt = level match {
      case 1 => "一等"
      case 2 => "二等"
      case 3 => "三等"
      case 4 => "四等"
      case _ => "其他"
    }
    println(s"levelText:${levelTxt}")
  }

}
Scala 复制代码
package ob9

object ob9_2 {
  //match case 匹配元组
  //能根据元组元素的个数来匹配,不是一一精确的匹配值
  def main(args: Array[String]): Unit = {
    //    val d1 = (1,2,3)
    val d1 = (1, 2, 3, 4)
    //    val d1 = (1,2,3,4,5)
    val d: Any = d1 //d的类型是Any

    d match {
      case (x, y, z) => println(s"这是一个由三个元素的元组,它的第二个元素是:${y}")
      case (x, y, z, k) => println(s"这是一个由四个元素的元组,它的最后一个个元素是:${k}")
      case _ => println("未知类型")
    }
  }
}

也可以:

Scala 复制代码
import scala.io.StdIn

object ob9_3 {
  def main(args: Array[String]): Unit = {
    //从控制台读入一个数字a
    val a = StdIn.readInt()

    //    if(a >= 0 && a <= 3) {println("[0-3]")}
    //    else if(a >= 4 && a <= 8) {println("[4-8]")}
    //    else {println("未匹配")}
    a match {
      case x if x >= 0 && x <= 3 => println("[0-3]")
      case x if x >= 4 && x <= 8 => println("[4-8]")
      case _ => println("未匹配")
    }
  }
}

练习:输入一个年份,是不是闰年

Scala 复制代码
import scala.io.StdIn

object ob9_4 {
  def main(args: Array[String]): Unit = {
    val year = StdIn.readInt()
    println(s"输入一个年份:$year")
    year match {
//      case x if x % 400 == 0 => println(s"$x 是闰年")
      case x if x % 4 == 0 && x % 100 != 0 => println("闰年")
      case _ => println("不是闰年")
    }
  }

}

以及:

Scala 复制代码
object ob9_5 {
  def main(args: Array[String]): Unit = {
    val i = 1
    val j:Double = 1.2
    val b:Boolean = false

    val x:Any = b
    x match {
      case _:Int => println(s"当前是Int")
      case _:Double => println(s"当前是Double")
      case a:Boolean => println(s"当前是Boolean $a")
      case _ => println("其他")
    }
  }

}

还有:

Scala 复制代码
// 匹配 数组: 元素的个数 + 元素的特征
object ob_6 {
  def main(args: Array[String]): Unit = {
    val arr1 = Array(1,2,3)
    val arr2 = Array(0,2,3)
    val arr3 = Array(1,2,3,4)
    val arr4 = Array(-1,1,2,3,4)

    val b:Any = arr3

    b match {
      case Array(1,x,y) => println(s"数组第一个元素是1,一共有3个元素${x},${y}")
      case Array(1,x,y,z) => println("数组第一个元素是1,一共有4个元素")
      case Array(_,1,_*) => println("数组第一个元素是1,一共有n个元素")
      case _ => println("其他")
    }
  }
}
相关推荐
渣渣盟18 小时前
Flink Table API与SQL流数据处理实战
大数据·sql·flink·scala
howard20054 天前
1.5 掌握Scala内建控制结构
scala·内建控制结构
howard20054 天前
1.1.2 Windows上安装Scala
scala·windows版本
allway24 天前
Debian Regular Expressions
运维·debian·scala
、BeYourself6 天前
Scala 字面量
开发语言·后端·scala
、BeYourself14 天前
Scala 数据类型
开发语言·后端·scala
howard200514 天前
1.2 Scala变量与数据类型
scala·变量·数据类型·常量
渣渣盟14 天前
Flink定时器实战:处理时间与事件时间
大数据·flink·scala