fold 方法使用初始累加器值迭代一個集合,並應用一個使用每個元素成功更新累加器的函式:

val nums = List(1,2,3,4,5)
var initialValue:Int = 0;
var sum = nums.fold(initialValue){
  (accumulator,currentElementBeingIterated) => accumulator + currentElementBeingIterated
}
println(sum) //prints 15 because 0+1+2+3+4+5 = 15

在上面的例子中,向 fold() 提供了一個匿名函式。你還可以使用帶有兩個引數的命名函式。在我看來,上面的例子可以重寫如下:

def sum(x: Int, y: Int) = x+ y
val nums = List(1, 2, 3, 4, 5)
var initialValue: Int = 0
val sum = nums.fold(initialValue)(sum)
println(sum) // prints 15 because 0 + 1 + 2 + 3 + 4 + 5 = 15

更改初始值將影響結果:

initialValue = 2;
sum = nums.fold(initialValue){ 
 (accumulator,currentElementBeingIterated) => accumulator + currentElementBeingIterated
}
println(sum) //prints 17 because 2+1+2+3+4+5 = 17

fold 方法有兩個變體 - foldLeftfoldRight

foldLeft() 從左到右迭代(從集合的第一個元素到該順序的最後一個元素)。foldRight() 從右到左迭代(從最後一個元素到第一個元素)。fold()foldLeft() 一樣從左到右迭代。實際上,fold() 實際上是在內部呼叫 foldLeft()

def fold[A1 >: A](z: A1)(op: (A1, A1) => A1): A1 = foldLeft(z)(op)

fold()foldLeft()foldRight() 將返回與其所需的初始值具有相同型別的值。但是,與 foldLeft()foldRight() 不同,fold() 的初始值只能是同一型別或集合型別的超型別。

在此示例中,順序不相關,因此你可以將 fold() 更改為 foldLeft()foldRight(),結果將保持不變。使用對訂單敏感的功能將改變結果。

如果有疑問,請選擇 foldLeft() 而不是 foldRight()foldRight() 效能較差。