我知道这可能会在某个地方得到回答,但是我缺乏正确的术语甚至无法搜索。 如果需要在流程中的某个点使用当前结果作为函数的参数,如何将函数组合在一起?
想象一下这种简单的情况:
Seq(1, 2, 3).map(_ * 2)
.map(doSomethingElseToEachValue(_))
.useAsParameterIn(functionThatTakesTheWholeSequence(_))
当然,可以简单地通过将中间结果分配给val并使用它来完成:
val intermeditateSeq = Seq(1, 2, 3)
.map(_ * 2)
.map(doSomethingElseToEachValue(_))
functionThatTakesTheWholeSequence(intermediateSeq)
或者通过将函数包装在整个事物上,但是随着执行流程在您阅读时来回移动,可读性非常差。 如果您将其中的多个操作交织在一起,还会弄得一团糟。
当我需要将整个对象用作参数而不是仅映射其内容时,如何保持从左至右,自上而下的逻辑流程?
答案 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
}
}