1. 程式人生 > >Spark記錄-Scala模式匹配

Spark記錄-Scala模式匹配

pri 存在 cas man 定義 nbsp 不同類 方式 出現

Scala模式匹配

模式匹配是Scala函數值和閉包後第二大應用功能。Scala為模式匹配提供了極大的支持,處理消息。

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

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

示例

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"
   }
}
Scala

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

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

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

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

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"
   }
}
Scala

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

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

使用case類匹配

case類是用於與case表達式進行模式匹配的特殊類。在語法上,這些是帶有特殊修飾符的標準類: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)
}
Scala

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

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

添加case關鍵字會導致編譯器自動添加一些有用的功能。該關鍵字表示與模式匹配中的case表達式的關聯。

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

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

最後,Person類的主體變為空,因為我們沒有定義任何方法!

形成正則表達式

Scala從Java繼承其正則表達式語法,後者繼承了Perl的大部分功能。

註意 - 每個反斜杠在上面的字符串中出現兩次。 這是因為在Java和Scala中,單個反斜杠是字符串文字中的轉義字符,而不是字符串中顯示的常規字符。 所以,反斜杠不是‘\‘,需要寫‘\\‘來獲取字符串中的單個反斜杠。

嘗試以下示例程序 -

import scala.util.matching.Regex

object Demo {
   def main(args: Array[String]) {
      val pattern = new Regex("abl[ae]\\d+")
      val str = "ablaw is able1 and cool"

      println((pattern findAllIn str).mkString(","))
   }
}
Scala

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

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

Spark記錄-Scala模式匹配