1. 程式人生 > 其它 >Scala的模式匹配----match

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)  //張三

  }
}