Scala的模式匹配----match
Scala的模式匹配----match
java 模式匹配可以匹配 :基本数据类型、字符串 、枚举
scala模式匹配可以匹配:基本数据类型、字符串、枚举、类型匹配、样例类
match: 按照顺序匹配,只匹配成功一次(前面匹配成功,后面的代码就不会执行了)
一 、模式匹配
1、匹配基本数据类型
object Demo27 {
def main(args: Array[String]): Unit = {
//定义一个变量,类型为基本数据类型
val i = 100
i match {
case 100 => println("100")
case 200 => println("2000")
case _ => println("其它")
}
执行结果:
100
//模式匹配可以有返回值
//对变量i处理:奇数加一,偶数乘2
val j: Int = i % 2 match { //可以有返回值,那么接收一下
case 1 => i + 1 //如果case匹配到1,说明是i是奇数,执行加1
case 0 => i * 2 //如果case匹配到0,说明是i是偶数,执行乘2
}
println(j) //200
}
}
2、匹配类型
object Demo27 {
def main(args: Array[String]): Unit = {
//定义一个变量,不确定变量的类型,使用Any
var str: Any = 12312.0
//需要匹配的类型,只能是变量类型的子类型(Any是所有类型的父类型)
str match {
case s: String => println(s"字符串类型:$s")
case i: Int => println(s"Int类型:$i")
case _ => println(s"其它类型:$str")
}
}
}
执行结果:
其它类型:12312.0
3、匹配样例类
object Demo27 {
def main(args: Array[String]): Unit = {
//定义一个样例类
case class User(id: String, name: String)
//创建一个样例类对象
val user = User("88", "张三")
user match {
case User("001", "张三") => println("张三")
case User("002", "李四") => println("李四")
case User("003", "王五") => println("王五")
case i: User => println(i) //如果匹配的是个对象,打印这个对象
case _ => println("其它")
}
}
}
执行结果:
User(88,张三)
二、模式匹配应用案例
案例1
object Demo27 {
def main(args: Array[String]): Unit = {
//定义一个List集合,集合的元素是元组
val list = List(("001", "张三", 23), ("002", "李四", 24), ("003", "王五", 25))
//想要给年龄加1
//使用map函数
val list2: List[(String, String, Int)] = list.map(kv => {
val id: String = kv._1 //id
val name: String = kv._2 //name
val age: Int = kv._3 //age
(id, name, age + 1)
})
list2.foreach(println)
//简写,map后面之间跟大括号{}
//使用模式匹配
//简写
val list3: List[(String, String, Int)] = list.map {
case (id: String, name: String, age: Int) => {
(id, name, age + 1)
}
}
list3.foreach(println)
}
}
执行结果:
(001,张三,24)
(002,李四,25)
(003,王五,26)
案例2:取出班级和年龄
object Demo27 {
def main(args: Array[String]): Unit = {
val students: List[String] = Source.fromFile("data/students.txt").getLines().toList
val list4: List[Array[String]] = students.map(student => student.split(","))
//前面切分的时候,返回的是一个数组
//匹配数组
val clazzAndAge: List[(String, String)] = list4.map {
case Array(id: String, name: String, age: String, gender: String, clazz: String) => {
(clazz, age)
}
}
clazzAndAge.foreach(println)
}
}
执行结果:
(文科六班,22)
(文科六班,24)
(理科六班,22)
(理科三班,24)
(理科五班,22)
(理科二班,21)
(文科六班,23)
(理科六班,22)
(理科一班,21)
(理科六班,23)
(理科三班,21)
...
案例3
package com.shujia.scala
object Demo28 {
def main(args: Array[String]): Unit = {
//定义一个Map集合
val m = Map("001" -> "张三", "002" -> "李四")
val name: String = m.getOrElse("001", "默认值")//传入的参数只会根据001,在Map集合中寻找对应的值
println(name) //张三
//使用getOrElse()需要传入两个参数;使用get()只需要传入一个key,返回的是Option类型
val option1: Option[String] = m.get("001")
println(option1) //Some(张三)
val option2: Option[String] = m.get("005")
println(option2) //None
/**
* Option: 是一个可选的值 (有值:Some , 没有值:None)
*/
//get()的情况下,我们可以使用option来进行匹配
val value: String = option1 match {
case Some(v) => v
case None => "默认值"
}
println(value) //张三
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现