Scala模式匹配演示

1.什么是模式匹配?

举个例子
我们有一批人员信息,如下所示

姓名    年龄    城市    性别
张三    28    北京    男
李四    29    北京    男
小花    18    上海    女
小鱼    19    河北    女
小牛    21    山东    男
.....

那我们只要北京的人员信息
(name,age,北京,sex)
根据这个模式匹配数据。

2.基础语法

一般模式匹配,使用match关键字,每个分支采用case关键字进行声明,当需要匹配时,会从第一个case分支开始,如果匹配成功,那么执行对应的逻辑代码,如果匹配不成功,继续执行下一个分支进行判断。
代码示例:

object Scala_Match {
  def main(args: Array[String]): Unit = {
    // 模式匹配基础语法
    val name:String = "张三"
    val res = name match {
      case "李四" => "员工"
      case "张三" => "经理"
    }
    println(res) // 输出 经理
  }
}

3.匹配示例

3.1 匹配常量值

object Scala_Match {
  def main(args: Array[String]): Unit = {
    def fun(x:Any) = x match {
      case 0 => "归零"
      case "新增" => "+"
      case "支出" => "-"
    }

    println(fun(0))
  }
}

3.2 匹配数据类型

object Scala_Match {
  def main(args: Array[String]): Unit = {
    def fun(x:Any) = x match {
      case str:String => "String"
      case int:Int => "Int"
      case _ => "other type"
    }

    println(fun(List(1, 2, 3)))
  }
}

3.3 匹配数组

object Scala_Match {
  def main(args: Array[String]): Unit = {
    val array = Array(Array(0), Array(0, 1), Array(0, 1, 2), Array(88, 123))
    for(arr <- array){
      val res = arr match {
        case Array(0) => "0" // 匹配Array(0)
        case Array(i, j) => "匹配两个元素的数组:"+i + "-" + j 
        case Array(0, _*) => "第一元素为零的数组"
        case _ => "其他数组"
      }
      println(res)
    }
  }
}

匹配列表、元组与匹配数组相似

3.4 匹配对象

第一种方式,较少使用

object Scala_Match {
  def main(args: Array[String]): Unit = {
    // 第一种方式,一般很少用,因为需要手动去声明unapply方法,不方便
   val person = Person("张三",18)
    val person_name = person match {
      case Person("张三", _) => "张三"
    }
    println(person_name)
    

  }
  class Person(val name:String,val age:Int)
  object Person{
    def apply(name: String, age: Int): Person = new Person(name, age)
    // Scala模式匹配会调用对象的unapply方法
    def unapply(person: Person): Option[(String, Int)] = {
      Option(person.name,person.age)
    }
  }
}

第二种方式,使用case声明的样例类

object Scala_Match {
  def main(args: Array[String]): Unit = {
    // 第二种方式
   val person = Person("张三",18)
    val person_name = person match {
      case Person("张三", _) => "张三"
    }
    println(person_name)

  }
  // 使用case声明样例类,会自动构建unapply方法
  case class Person(name:String, age:Int)
}

leafgood
183 声望15 粉丝

踏入IT这个圈子,就成了一名玩家,想要走的更远,就要不断给自己技能加点才行。


引用和评论

1 篇内容引用
0 条评论