fold函數將上一步返回的值做爲函數的第一個參數繼續傳遞參與運算,直到list中的全部元素被遍歷。函數
1)能夠把reduceLeft看作簡化版的foldLeft。學習
如何理解:spa
def reduceLeft[B >: A](@deprecatedName('f) op: (B, A) => B): B =code
if (isEmpty) throw new UnsupportedOperationException("empty.reduceLeft")blog
else tail.foldLeft[B](head)(op)ip
你們能夠看到. reduceLeft就是調用的foldLeft[B](head),而且是默認從集合的head元素開始操做的。開發
2)相關函數:fold,foldLeft,foldRight,能夠參考reduce的相關方法理解it
foldLeft和foldRight 縮寫方法分別是:/:和:\io
val list4 = List(1, 9, 2, 8) def minus(num1: Int, num2: Int): Int = { num1 - num2 } var i6 = (1 /: list4) (minus) // =等價=> list4.foldLeft(1)(minus) println(i6) // 輸出? i6 = (100 /: list4) (minus) println(i6) // 輸出? i6 = (list4 :\ 10) (minus) // list4.foldRight(10)(minus) println(i6) // 輸出?
掃描,即對某個集合的全部元素作fold操做,可是會把產生的全部中間結果放置於一個集合中保存class
應用實例
def minus( num1 : Int, num2 : Int ) : Int = { num1 - num2 } //5 (1,2,3,4,5) =>(5,4,2,-1,-5,-10) val i8 = (1 to 5).scanLeft(5)(minus) //IndexedSeq[Int] println(i8) def add( num1 : Int, num2 : Int ) : Int = { num1 + num2 } //5 (1,2,3,4,5) =>(5,6,8, 11,15,20) val i9 = (1 to 5).scanLeft(5)(add) //IndexedSeq[Int] println(i9)
在開發中,當咱們須要將兩個集合進行 對偶元組合併,可使用拉鍊。
// 拉鍊 val list1 = List(1, 2 ,3) val list2 = List(4, 5, 6) val list3 = list1.zip(list2) // (1,4),(2,5),(3,6) println("list3=" + list3)
注意事項
1)拉鍊的本質就是兩個集合的合併操做,合併後每一個元素是一個 對偶元組。
2)操做的規則下圖:
3)若是兩個集合個數不對應,會形成數據丟失。
4)集合不限於List, 也能夠是其它集合好比 Array
5)若是要取出合併後的各個對偶元組的數據,能夠遍歷
經過iterator方法從集合得到一個迭代器,經過while循環和for表達式對集合進行遍歷.(學習使用迭代器來遍歷)
應用案例
val iterator = List(1, 2, 3, 4, 5).iterator // 獲得迭代器 println("--------遍歷方式1 -----------------") while (iterator.hasNext) { println(iterator.next()) } println("--------遍歷方式2 for -----------------") for(enum <- iterator) { println(enum) // }
應用案例小結
1) iterator 的構建實際是 AbstractIterator 的一個匿名子類,該子類提供了 /* def iterator: Iterator[A] = new AbstractIterator[A] { var these = self def hasNext: Boolean = !these.isEmpty def next(): A = */
2)該AbstractIterator 子類提供了 hasNext next 等方法.
3)所以,咱們可使用 while的方式,使用hasNext next 方法變量