Scala的模式匹配

模式匹配是Scala中非常有特色、非常强大的一种功能,类似子Java中的svitch case语法即对一个值进行条件判断,然后针对不同的条件进行不同的处理。但是Scala的模武匹配的功能比Java中的功能要强大,Java的switch case语法只能对值进行匹配。但是Scala的楼式匹配除了可以对值进行匹配之外,还可以对类型、Array 和List等进行匹配。

模式匹配属于Scala中的高级特性,在Scala中占有非常重要的地位,Scala程序的源代码中存在大量的模式匹配。在Java中,switch具有匹配的作用,但是switch有匹配支持的类型不完善等缺点。Java中的switch只支持byte、short、int、char 和String以及枚举类型的模式匹配。

Scala中模式匹配的语法格式

  1. Scala的模式数据类型:

Scala的模式匹配数据类型非常丰富,既可以是自定义的类,也可以是Scala本身的类。有Stimg类、变量、常量以及其他复杂类型,其中类表示数据类型。匹配变量时需要结合守卫语句,通过派加守卫语句即条件判断,可以过滤一部分不必要的值。匹配其他复杂类型包括构造器、元组等。匹配响造器时会对构造器的参数和对应类的类型进行匹配。

下面举例说明Scala的模式匹配。

(1)常量。(2)变量。(3)构造器。(4)序列。(5)元组。(6)类型。(7)变量绑定。

例题

Scala 复制代码
​
object Test {
  def main(args: Array[String]): Unit = {
    //身份证号
    val id = "33900520202310042"
//    val id = "429005202023210042"
//    val id = "31900520202310042"
//    val id = "11900520202310042"

    //截取前两位
    val pre = id.substring(0,2).toInt

    pre match {
      case 42 => println("湖北")
      case 11 => println("北京")
      case 31 => println("上海")
      case  _ => println("其他")
      //细节1:case _ 的位置 一定要放在最后!!!
      //细节2:case _ 不写,如果没有正确的匹配项,报错!
    }
    //如果是42,输出湖北
    //如果是11,输出北京
    //如果是31,输出上海
    //否则,就输出  其他
    //if else if else
//    if(pre == 42) {
//      println("湖北")
//    }else if(pre == 11) {
//      println("北京")
//    }else if(pre == 31) {
//      println("上海")
//    }else{
//      println("其他")
//
//    }
  }

}

​
Scala 复制代码
object test1 {
  def main(args: Array[String]): Unit = {

    //从数据库中获得数据 1,2,3,4
    //  要显示给用户的是    一等,二等,三等,四等
    val level = 1
    val levelTxt = level match {
      case 1 => "一等"
      case 2 => "二等"
      case 3 => "三等"
      case 4 => "四等"
      case _ => "未知"
    }
    println(s"levelText:${levelTxt}")
  }
}
Scala 复制代码
object test2 {
  // 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"这是一个有四个元素的元组,它的最后一个元素是:${y}")
      case _ => println("未知类型")
    }
  }

}

答案:1.B 2. other

Scala 复制代码
import scala.io.StdIn

object test3 {
  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("未匹配")}
    println(s"用户输入的是:$a")
    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 test4 {
  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(s"$x 是闰年")
     case _ => println(s"$year 不是闰年")
   }
  }

}
Scala 复制代码
object test5 {
  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 _:Boolean => println(s"当前是Boolean")
      case _ => println("其他")
    }
  }

}
Scala 复制代码
object test6 {
  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(_,x,_*) => println("数组第二元素是1,一个有n个元素")
      case _ => println("其他")
    }
  }

}
Scala 复制代码
object test7 {
  case class Person(name:String)
  case class Student(name:String,className:String)
  //match case 能根据 类名和属性的信息,匹配到相应的类
  //注意:
  //1.匹配的时候,case  class的属性个数要对上
  //2.属性名不需要一一对应

  def main(args: Array[String]): Unit = {
    val p1 = Person("小花")
    val s1 = Student("小明","2(3)班")

    val a:Any = p1
    a match {
      case Person(nm) => println("普通人类",nm)
      case Student(name,className) => println(className,"的学生",name)
      case _ => println("其他")
    }
  }

}
Scala 复制代码
object test8 {
  //需求:现在有一个数组Array(1,2,3,4),我希望能定义三个变量,他们的值分别是数组中的1,2,3个元素的值
  def main(args: Array[String]): Unit = {
    val arr = Array(1,2,3,4,5)
//    第一个元素的值:arr(0)
//    println(arr(0))
//    var x = arr(1)
//    var y = arr(2)
//    var z = arr(3)
//    println(x,y,z)
    //有一个更简单的方式

    //模式匹配
    var Array(_,x,y,z,_*) = arr
    println(x)
    println(y)
    println(z)
  }

}
Scala 复制代码
object test9 {
  def main(args: Array[String]): Unit = {
    val m1 = Map(
      "my - 阿里巴巴" -> 1964,
      "mht - 腾讯" -> 1971,
      "lyh - 百度" -> 1968,
      "lj - 小米" -> 1969,
      "dl - 网易" -> 1971,
    )

//    val t = ["雷总",1969] //元组
//    println(t._2)
    //找出哪些是1971年的老板?
    //对于Map,可以 for 遍历
    //模式匹配
    for((k,1971) <- m1){
      println(k)
    }
  }

}
相关推荐
手心里的白日梦2 分钟前
多线程与线程互斥
linux·服务器·开发语言·网络
high201110 分钟前
【Hadoop】-- hadoop3.x default port
大数据·hadoop·分布式
ueanaIU潇潇子10 分钟前
Windows安装elasticsearch、Kibana以及IK分词器
大数据·elasticsearch·搜索引擎·kibana·ik分词器
一个略懂代码的程序员18 分钟前
ES(elasticsearch)
大数据·elasticsearch·jenkins
易和安33 分钟前
JS进阶DAY5|本地存储
开发语言·javascript·ecmascript
寒山李白37 分钟前
Nignx部署Java服务测试使用的Spring Boot项目Demo
java·开发语言·spring boot
说私域37 分钟前
电商信任构建与创新模式:基于 2+1 链动模式与 S2B2C 商城小程序的分析
大数据·人工智能·微信小程序·小程序
oioihoii43 分钟前
C++ 中 std::array<int, array_size> 与 std::vector<int> 的深入对比
开发语言·c++
码猩1 小时前
C# 代理IP的winform
开发语言·c#
E___V___E1 小时前
计算机组成原理复习
java·开发语言