码迷,mamicode.com
首页 > 其他好文 > 详细

从合并两个Map说开去 - foldLeft 和 foldRight 还有模式匹配

时间:2019-03-30 13:16:54      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:操作   size   info   解决   设计   font   函数   就是   键值   

开发中遇到需求:合并两个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 还有模式匹配

标签:操作   size   info   解决   设计   font   函数   就是   键值   

原文地址:https://www.cnblogs.com/itboys/p/10626372.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!