在Scala中应用列表中的所有函数

在Scala中应用列表中的所有函数,scala,Scala,比如说,我有一个类MyFunc,它有一个方法def transform(rdd:rdd):rdd。这个类来自图书馆,所以我不能更改它 现在假设我有一个列表[MyFun],我想应用于rdd变量。 我可以这样写: def applyAll(myFuncs: List[MyFunc], rdd: RDD): RDD = { var mutableRef = rdd for (myFunc <- myFuncs) { mutableRef = myFunc.transform(mu

比如说,我有一个类
MyFunc
,它有一个方法
def transform(rdd:rdd):rdd
。这个类来自图书馆,所以我不能更改它

现在假设我有一个
列表[MyFun]
,我想应用于
rdd
变量。 我可以这样写:

def applyAll(myFuncs: List[MyFunc], rdd: RDD): RDD = {
  var mutableRef = rdd
  for (myFunc <- myFuncs) {
    mutableRef = myFunc.transform(mutableRef)
  }
  mutableRef
}
def applyAll(myFuncs:List[MyFunc],rdd:rdd):rdd={
var mutableRef=rdd

对于(myFunc,有几种方法可以做到这一点,最简单的方法是使用
foldLeft
。但是,您仍然可以使用递归轻松编写它,而无需任何变异,如下所示:

 def applyAll(myFuncs: List[MyFunc], rdd: RDD): RDD = {

  @tailrec
  def applyOne(myFuncs: List[MyFunc],newRDD: RDD): RDD = myFuncs match {
  case h::t => applyOne(t, h.transform(newRDD))
  case Nil => newRDD
  }
  applyOne(myFuncs,rdd)
 }

foldLeft
很棒,你应该使用它,但它与你最初做的非常相似,即它在列表上循环并变异一个变量。

myFuncs.foldLeft(rdd)((r,f)=>f(r))
?事实上,
myFuncs.foldLeft(rdd)(f(_.\u 1))
。如果函数的顺序相反(或顺序无关紧要)您可以这样做:
foldRight(rdd)(())
太棒了!谢谢!它缺少转换方法,因此最终版本将是:
myFuncs.foldLeft(rdd)((r,f)=>f.transform(r))
或类似于Andy的建议。