從合並兩個Map說開去 - foldLeft 和 foldRight 還有模式匹配
阿新 • • 發佈:2019-03-30
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 還有模式匹配