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("其他")
    }
  }
}
相关推荐
hopsky13 天前
《Scala 学习手册》核心内容详解
人工智能·学习·scala
abcy07121324 天前
scala playframework 搭建与新建controller教程
scala
lpfasd12324 天前
编程语言榜单变迁分析
开发语言·后端·scala
戮漠summer1 个月前
Missing Semester 计算机教育中缺失的一课 Lecture 01 Shell
开发语言·后端·scala
醉熏的石头2 个月前
Ubuntu 中的编程语言(中)
linux·ubuntu·scala
Irene19912 个月前
Scala、Java、Python、JavaScript 的核心特性和应用场景(Python 的“单机“局限性:GIL 机制导致的多核并行缺陷)
java·javascript·python·scala
李白的天不白3 个月前
确认 Nginx 配置文件是否真的生效
scala
醉颜凉3 个月前
Scala自定义Monad实战:从理论到应用的完整指南
大数据·算法·scala
那晚的她3 个月前
Scala中Set集合
开发语言·后端·scala
IvanCodes3 个月前
二、Scala流程控制:分支与循环
大数据·scala