scala - 從合併兩個Map說開去 - foldLeft 和 foldRight 還有模式匹配

開發中遇到需求:合併兩個Map集合對象(將兩個對應KEY的值累加)函數

先說解決方案:spa

( map1 /: map2 ) { case (map, (k,v)) => map + ( k -> (v + map.getOrElse(k, 0)) ) }

 

這特麼什麼鬼  (╯‵□′)╯""┻━┻☆))>○<) 。。。。。。莫急,且聽我慢慢道來。。。。。。。。。.net


首先:scala

Scala中現有的合併集合操做不能知足這個需求 。設計

注意合併後的結果a的G02的值實際上是被覆蓋掉了。。code

 

而後:對象

說說那個表達式中(a /: b)( ... ) 這部分是什麼鬼。這個實際上是scala簡化的foldLeft函數。blog

先看foldLeft開發

List(1,2,3).foldLeft(0)((sum,i)=>sum+i)  // 紅色部分是初始值,藍色部分是操做函數get

List(1,2,3).foldLeft(0)((sum,i)=>sum+i)
能夠寫成
(List(1,2,3) foldLeft 0)((sum,i)=>sum+i)
語法糖
(0 /: List(1,2,3))(_+_)  

操做符設計者的腦洞也是夠了 - - 開發者絕對是表情帝

若是接受了這個設定。。。foldRight也能夠腦補出來。。 必定是  ((1 to 5) :\ 100)((i,sum)=> sum-i) .......

另外。一個例子說明  foldLeft 和 foldRight:

 

 最後: 

來講說操做函數中的case  ,這個鬼叫模式匹配 (哦對,模式匹配的時候是要有個大括號包起來的 因此最終結果的操做函數使用大括號包着。)

Map的摺疊函數是依次傳入Map的鍵值對。因此操做函數但願傳入的操做數能夠是(K,V)形式。。因而用case表達式:(map, (k,v))

具體模式匹配是什麼。。簡單說就是scala會嘗試將傳入的值匹配到case後面表達式的樣子(固然這裏必定會匹配上,因此沒有寫case的多餘分支)具體什麼是「模式匹配」,目前理解尚淺此處暫不深刻妄加揣測。

壹 Try 勝千言 :

 

 


參考

1) http://stackoverflow.com/questions/7076128/best-way-to-merge-two-maps-and-sum-the-values-of-same-key

2) http://blog.csdn.net/wsscy2004/article/details/37698013

3) http://my.oschina.net/sulliy/blog/58266

相關文章
相關標籤/搜索