用于收集

虽然部分函数通常用作总函数的方便语法,但通过包含最终的通配符匹配(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 子句)和右侧。