说,我有一个类MyFunc
,它有一个方法def transform(rdd: RDD): RDD
。这个课程来自图书馆,所以我无法改变它。
现在想象一下,我想在List[MyFun]
变量上应用rdd
。
我可以把它写成:
def applyAll(myFuncs: List[MyFunc], rdd: RDD): RDD = {
var mutableRef = rdd
for (myFunc <- myFuncs) {
mutableRef = myFunc.transform(mutableRef)
}
mutableRef
}
斯卡拉的美丽来自简洁。因此,我正在寻找一种以简洁的方式按顺序应用所有MyFunc
的方法。
答案 0 :(得分:1)
有几种方法可以做到这一点,评论中建议最简单的方法是使用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
很棒,你应该使用它,但它与你正在做的非常相似,即它循环遍历列表并改变变量。