Scala深入淺出實戰經典之 List的foldLeft、foldRight、sort操作代碼實戰


 Scala 深入淺出實戰經典(1-64講)完整視頻、PPT、代碼下載:
百度雲盤:http://pan.baidu.com/s/1c0noOt6 
騰訊微雲:http://url.cn/TnGbdC 
360雲盤:http://yunpan.cn/cQ4c2UALDjSKy   訪問密碼 45e2  

以下為第37講List的foldLeft、foldRight、sort操作代碼實戰

package com.parllay.scala.dataset

/**
* Created by richard on 15-7-22.
*/
object List_Fold_Sort {

def main(args: Array[String]) {

/**
* Scala深入淺出實戰經典之 List的foldLeft、foldRight、sort操作代碼實戰
*
* 本質上說,fold函數將一種格式的輸入數據轉化成另外一種格式返回。fold, foldLeft和foldRight這三個函數除了有一點點不同外,做的事情差不多。
val numbers = List(5, 4, 8, 6, 2)
numbers.fold(0) { (z, i) =>
z + i
}
// result = 25
   List中的fold方法需要輸入兩個參數:初始值以及一個函數。輸入的函數也需要輸入兩個參數:累加值和當前item的索引。
那么上面的代碼片段發生了什么事?
  代碼開始運行的時候,初始值0作為第一個參數傳進到fold函數中,list中的第一個item作為第二個參數傳進fold函數中。
  1、fold函數開始對傳進的兩個參數進行計算,在本例中,僅僅是做加法計算,然后返回計算的值;
  2、Fold函數然后將上一步返回的值作為輸入函數的第一個參數,並且把list中的下一個item作為第二個參數傳進繼續計算,同樣返回計算的值;
  3、第2步將重復計算,直到list中的所有元素都被遍歷之后,返回最后的計算值,整個過程結束;
  4、這雖然是一個簡單的例子,讓我們來看看一些比較有用的東西。早在后面將會介紹foldLeft函數,並解釋它和fold之間的區別,
目前,你只需要想象foldLeft函數和fold函數運行過程一樣。

fold, foldLeft, and foldRight之間的區別
  主要的區別是fold函數操作遍歷問題集合的順序。foldLeft是從左開始計算,然后往右遍歷。foldRight是從右開始算,然后往左遍歷。
而fold遍歷的順序沒有特殊的次序。來看下這三個函數的實現吧(在TraversableOnce特質里面實現)

def fold[A1 >: A](z: A1)(op: (A1, A1) => A1): A1 = foldLeft(z)(op)
def foldLeft[B](z: B)(op: (B, A) => B): B = {
var result = z
this.seq foreach (x => result = op(result, x))
result
}

def foldRight[B](z: B)(op: (A, B) => B): B =
reversed.foldLeft(z)((x, y) => op(y, x))
  由於fold函數遍歷沒有特殊的次序,所以對fold的初始化參數和返回值都有限制。在這三個函數中,初始化參數和返回值的參數類型必須相同。
  第一個限制是初始值的類型必須是list中元素類型的超類。在我們的例子中,我們的對List[Int]進行fold計算,而初始值是Int類型的,它是List[Int]的超類。
  第二個限制是初始值必須是中立的(neutral)。也就是它不能改變結果。比如對加法來說,中立的值是0;而對於乘法來說則是1,對於list來說則是Nil。

  順便說下,其實foldLeft和foldRight函數還有兩個縮寫的函數:
def /:[B](z: B)(op: (B, A) => B): B = foldLeft(z)(op)

def :\[B](z: B)(op: (A, B) => B): B = foldRight(z)(op)

scala> (0/:(1 to 100))(_+_)
res32: Int = 5050
scala> ((1 to 100):\0)(_+_)
res24: Int = 5050
*/
println((1 to 100).foldLeft(0)(_+_))
println((0 /: (1 to 100))(_+_))

println((1 to 5).foldRight(100)(_-_))
println(((1 to 5):\ 100)(_-_))

println(List(1, -3, 4, 2, 6) sortWith(_<_))
println(List(1, -3, 4, 2, 6) sortWith(_>_))

}

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM