Scala与`collect`结合使用

示例

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