鍍金池/ 教程/ Scala/ Scala模式匹配
Scala方法重載
Scala模式匹配
Scala throw關(guān)鍵字
Scala提取器
Scala概述
Scala throws關(guān)鍵字
Scala finally塊
Scala正則表達(dá)式
Scala循環(huán)語句
Scala多線程
Scala函數(shù)
Scala final關(guān)鍵字
Scala方法覆蓋
Scala字符串
Scala線程實現(xiàn)
Scala異常處理
Scala類和對象
Scala數(shù)據(jù)類型
Scala單例和伴生對象
Scala構(gòu)造函數(shù)
Scala教程
Scala Case類和對象
Scala繼承
Scala開發(fā)環(huán)境安裝配置
Scala運算符
Scala文件I/O
Scala線程方法
Scala變量
Scala try-catch語句
Scala基礎(chǔ)語法
Scala集合
Scala數(shù)組
Scala閉包
Scala訪問修辭符
Scala this關(guān)鍵字

Scala模式匹配

模式匹配是Scala函數(shù)值和閉包后第二大應(yīng)用功能。Scala為模式匹配提供了極大的支持,處理消息。

模式匹配包括一系列備選項,每個替代項以關(guān)鍵字大小寫為單位。每個替代方案包括一個模式和一個或多個表達(dá)式,如果模式匹配,將會進(jìn)行評估計算。箭頭符號=>將模式與表達(dá)式分離。

嘗試以下示例程序,它顯示匹配的整數(shù)值。

示例

object Demo {
   def main(args: Array[String]) {
      println(matchTest(3))
   }

   def matchTest(x: Int): String = x match {
      case 1 => "one"
      case 2 => "two"
      case _ => "many"
   }
}

將上述程序保存在源文件:Demo.scala中,使用以下命令編譯和執(zhí)行此程序。

D:\>scalac Demo.scala
D:\>scala Demo
many

具有case語句的塊定義了一個將整數(shù)映射到字符串的函數(shù)。match關(guān)鍵字提供了一種方便的方式來應(yīng)用一個函數(shù)(如上面的模式匹配函數(shù))到一個對象。

請嘗試以下示例程序,其中的值與不同類型的模式相匹配。

object Demo {
   def main(args: Array[String]) {
      println(matchTest("two"))
      println(matchTest("test"))
      println(matchTest(1))
   }

   def matchTest(x: Any): Any = x match {
      case 1 => "one"
      case "two" => 2
      case y: Int => "scala.Int"
      case _ => "many"
   }
}

將上述程序保存在源文件:Demo.scala中,使用以下命令編譯和執(zhí)行此程序。

D:\>scalac Demo.scala
D:\>scala Demo
2
many
one

使用case類匹配

case類是用于與case表達(dá)式進(jìn)行模式匹配的特殊類。在語法上,這些是帶有特殊修飾符的標(biāo)準(zhǔn)類:case

嘗試以下,它是一個簡單的模式匹配示例使用case類。

object Demo {
   def main(args: Array[String]) {
      val alice = new Person("Alice", 25)
      val bob = new Person("Bob", 32)
      val charlie = new Person("Charlie", 32)

      for (person <- List(alice, bob, charlie)) {
         person match {
            case Person("Alice", 25) => println("Hi Alice!")
            case Person("Bob", 32) => println("Hi Bob!")
            case Person(name, age) => println(
               "Age: " + age + " year, name: " + name + "?")
         }
      }
   }
   case class Person(name: String, age: Int)
}

將上述程序保存在源文件:Demo.scala中,使用以下命令編譯和執(zhí)行此程序。

D:\>scalac Demo.scala
D:\>scala Demo
Hi Alice!
Hi Bob!
Age: 32 year, name: Charlie?

添加case關(guān)鍵字會導(dǎo)致編譯器自動添加一些有用的功能。該關(guān)鍵字表示與模式匹配中的case表達(dá)式的關(guān)聯(lián)。

首先,編譯器會自動將構(gòu)造函數(shù)轉(zhuǎn)換為不可變字段(vals)。 val關(guān)鍵字是可選的。 如果想要可變字段,請使用var關(guān)鍵字。 因此,構(gòu)造函數(shù)參數(shù)列表更短。

其次,編譯器會自動對類進(jìn)行equalshashCodetoString方法,該方法使用指定為構(gòu)造函數(shù)參數(shù)的字段。 所以,我們不再需要自己的toString()方法。

最后,Person類的主體變?yōu)榭?,因為我們沒有定義任何方法!