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

Scala 如何使用值作为目标函数的参数,scala,functional-programming,apply,Scala,Functional Programming,Apply,我意识到这可能在某个地方得到了答案,但我甚至没有正确的术语来搜索它。 如果在流程中的某个点,我需要将当前结果用作函数的参数,那么如何将函数组合在一起 想象一下这种简单的情况: Seq(1, 2, 3).map(_ * 2) .map(doSomethingElseToEachValue(_)) .useAsParameterIn(functionThatTakesTheWholeSequence(_)) 当然,只需将中间结果分配给val并使用以

我意识到这可能在某个地方得到了答案,但我甚至没有正确的术语来搜索它。 如果在流程中的某个点,我需要将当前结果用作函数的参数,那么如何将函数组合在一起

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

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

当然,只需将中间结果分配给val并使用以下方法即可:

val intermeditateSeq = Seq(1, 2, 3)
    .map(_ * 2)
    .map(doSomethingElseToEachValue(_))
functionThatTakesTheWholeSequence(intermediateSeq)
或者通过将函数包装在整个内容上,但是当执行流在读取时来回移动时,会导致可读性非常差。 如果将多个这些操作交织在一起,它也会变得一团糟


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

如果您只想在
Seq[Int]
中执行此类操作,您可以创建隐式类

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

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

Seq(1, 2, 3)
  .map(_ * 2)
  .map(doSomethingElseToEachValue) match {
      case xs => functionThatTakesTheWholeSequence(xs)
  }
Scala 2.13还带来了新的更好的可能性,包括:

实际上,编写管道非常简单,所以如果您不能使用2.13,但想使用管道,只需从以下位置复制扩展函数:


你这样做很好。除了你已经描述过的方法之外,没有其他方法可以做到这一点。我很确定有其他方法可以做到这一点。至少你应该能够引入一个隐式函数,它在内部执行f(a)。然而,有时我想保持可读性,即使在性能是一个问题的情况下,所以如果可能的话,最好避免过度装箱。类似管道的东西正是我想要的,谢谢。我个人觉得很奇怪,像这样的东西现在才被添加。@H4uZ我也不知道'\_(ツ)_/¯
Seq(1, 2, 3)
  .map(_ * 2)
  .map(doSomethingElseToEachValue)
  .pipe(functionThatTakesTheWholeSequence)
implicit class ChainingOps[A](private val self: A) extends AnyVal {
   def pipe[B](f: A => B): B = f(self)
}