用於收集

雖然部分函式通常用作總函式的方便語法,但通過包含最終的萬用字元匹配(case _),在某些方法中,它們的偏好是關鍵。慣用 Scala 中的一個非常常見的例子是在 Scala 集合庫中定義的 collect 方法。這裡,部分函式允許檢查集合的元素的公共函式來對映和/或過濾它們以在一個緊湊的語法中發生。

例 1

假設我們將平方根函式定義為部分函式:

val sqRoot:PartialFunction[Double,Double] = { case n if n > 0 => math.sqrt(n) }

我們可以用 collect 組合器呼叫它:

List(-1.1,2.2,3.3,0).collect(sqRoot)

有效地執行相同的操作:

List(-1.1,2.2,3.3,0).filter(sqRoot.isDefinedAt).map(sqRoot)

例 2

sealed trait SuperType // `sealed` modifier allows inheritance within current build-unit only
case class A(value: Int) extends SuperType
case class B(text: String) extends SuperType
case object C extends SuperType

val input: Seq[SuperType] = Seq(A(5), B("hello"), C, A(25), B(""))

input.collect {
  case A(value) if value < 10   => value.toString
  case B(text) if text.nonEmpty => text
} // Seq("5", "hello")

上面的例子中有幾點需要注意:

  • 每個模式匹配的左側有效地選擇要處理的元素幷包括在輸出中。任何沒有匹配 case 的值都會被省略。
  • 右側定義要應用的特定於案例的處理。
  • 模式匹配繫結變數以用於保護語句(if 子句)和右側。