Scala的模式匹配----match
阿新 • • 發佈:2022-03-06
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) //張三
}
}