折
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
方法有兩個變體 - foldLeft
和 foldRight
。
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()
效能較差。