1. 程式人生 > >Scala 之 合併兩個map

Scala 之 合併兩個map

轉自:http://www.cnblogs.com/tugeler/p/5134862.html

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

先說解決方案:

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

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

首先:

Scala中現有的合併集合操作不能滿足這個需求 。

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

然後:

說說那個表示式中(a/

: b)( ... ) 這部分是什麼鬼。這個其實是scala簡化的foldLeft函式。

先看foldLeft

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

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 勝千言 :