尽管部分函数通常用作总函数的便捷语法,但通过包含最终通配符match(case _),在某些方法中,部分函数是关键。习惯性Scala中一个非常常见的示例是collect在Scala集合库中定义的方法。在此,部分函数允许检查集合元素以映射和/或过滤它们的通用功能以一种紧凑的语法出现。
例子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”修饰符仅允许在当前构建单元内进行继承 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) iftext.nonEmpty=> text } // Seq("5", "hello")
上面的示例中有几件事要注意:
每个模式匹配的左侧都会有效地选择要处理的元素,并将其包含在输出中。没有匹配的任何值都将case被忽略。
右侧定义了要应用的特定案例处理。
模式匹配将绑定变量用于保护语句(if子句)和右侧。