1. 程式人生 > >從合並兩個Map說開去 - foldLeft 和 foldRight 還有模式匹配

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

pan 開發者 簡化 ase map集合 兩個 簡單 tro 嘗試

開發中遇到需求:合並兩個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 勝千言 :

技術分享圖片

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