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

相关文章
相关标签/搜索