用於收集
雖然部分函式通常用作總函式的方便語法,但通過包含最終的萬用字元匹配(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
子句)和右側。