如何使用值作为目标函数的参数

时间:2019-05-14 14:31:27

标签: scala functional-programming apply

我知道这可能会在某个地方得到回答,但是我缺乏正确的术语甚至无法搜索。 如果需要在流程中的某个点使用当前结果作为函数的参数,如何将函数组合在一起?

想象一下这种简单的情况:

Seq(1, 2, 3).map(_ * 2)
            .map(doSomethingElseToEachValue(_))
            .useAsParameterIn(functionThatTakesTheWholeSequence(_))

当然,可以简单地通过将中间结果分配给val并使用它来完成:

val intermeditateSeq = Seq(1, 2, 3)
    .map(_ * 2)
    .map(doSomethingElseToEachValue(_))
functionThatTakesTheWholeSequence(intermediateSeq)

或者通过将函数包装在整个事物上,但是随着执行流程在您阅读时来回移动,可读性非常差。 如果您将其中的多个操作交织在一起,还会弄得一团糟。

当我需要将整个对象用作参数而不是仅映射其内容时,如何保持从左至右,自上而下的逻辑流程?

2 个答案:

答案 0 :(得分:4)

您可以做的第一件事就是匹配:

Seq(1, 2, 3)
  .map(_ * 2)
  .map(doSomethingElseToEachValue) match {
      case xs => functionThatTakesTheWholeSequence(xs)
  }

Scala 2.13借助pipe也带来了新的更好的可能性:

Seq(1, 2, 3)
  .map(_ * 2)
  .map(doSomethingElseToEachValue)
  .pipe(functionThatTakesTheWholeSequence)

实际上,编写 pipe 非常简单,因此,如果您不能使用 2.13 ,但又想使用 pipe ,则只需复制{ {3}}:

implicit class ChainingOps[A](private val self: A) extends AnyVal {
   def pipe[B](f: A => B): B = f(self)
}

答案 1 :(得分:1)

如果您只想在Seq[Int]中进行此类操作,则可以创建一个隐式类。

implicit class daClazz(list: Seq[Int]){
  def useAsParameterIn()= {
    //do stuff here
  }
}