(五)Scala模式匹配示例

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原文地址:https://segmentfault.com/a/1190000039225709

%s 个评论

要回复文章请先登录注册