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("其他")
    }
  }
}
相关推荐
财神爷的心尖宠559 小时前
scala字面值
开发语言·后端·scala
我爱写代码?9 小时前
Scala的单例对象
开发语言·后端·scala
小萌新~~~~1 天前
在Scala中正则表达式的类型
开发语言·正则表达式·scala
洋芋爱吃芋头1 天前
scala的泛型2
开发语言·后端·scala
古拉拉明亮之神1 天前
Scala的链式风格
scala·命令模式·代码规范·源代码管理
悻运1 天前
scala的泛型类
开发语言·后端·scala
2401_833788051 天前
Scala函数的泛型
开发语言·后端·scala
进朱者赤1 天前
用 Java 的思路快速学习 Scala
scala
百流1 天前
scala基础_数据类型概览
开发语言·学习·scala
刘翔在线犯法1 天前
Scala中函数默认参数和隐式类、对象
开发语言·python·scala