Scala集合函數groupBy源碼分析

在這裏插入圖片描述

groupBy源碼分析

  1. 創建一個可變map對象m->【k:K v:mutable.Bulder[A,Repr]】
    在這裏插入圖片描述
    這裏的Bulder 元素爲A,構建類型爲Repr,它可以通過+=來向構造器中添加元素,通過result返回得到一個任意類型的集合!

  2. 遍歷集合,向m中添加元素,key爲傳過來的集合中的元素通過函數f()計算返回的結果,如果該key是在m中沒有,則創建一個元素類型爲A,構建類型爲Repr的Builder對象放入value中,並讓bldr指向該Builder對象,向bldr中添加元素elem(事實上是向m的value中添加elem)

舉例: 第一次f()計算結果是1,elem是"a",由於是第一次,則創建新的Builder給V,此時m = (1 -> (“a”)),第二次f()計算結果還是1,elem是"b",此時m=(1 ->(“a”,“b”)),第三次f()計算結果變成2了,elem是"c",由於key->2第一次出現,則創建新的Builder,此時m=(1 ->(“a”,“b”),2 -> (“c”))

此時m->k=f(elem),v=elems
  1. 創建一個構造器b,元素類型是Tupple2(K,Repr),構建類型是Map(K,Repr),遍歷m,向b中添加k和v,將m的數據導入到構造器b中 調用result輸出集合

總結:groupBy傳入的參數f(A)=>K,A爲調用函數的集合元素類型,K爲輸出map的key。
輸出map的value類型爲調用函數的集合的類型
舉例:

    println(Map[Int, Int]((1, 2), (2, 3), (3, 4), (4, 5))
      .groupBy(kv => 1))

    println(Map[Int, Int]((1, 2), (0, 3), (2, 3), (3, 2))
      .groupBy(kv => kv._1+kv._2))

結果:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章