加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 18:43:17 所属栏目:安全 来源:网络整理
导读:开发中遇到需求:合并两个Map集合对象(将两个对应Key的值累加) 先说解决方案: ( map1 /: map2 ) { case (map,(k,v)) = map + ( k - (v + map.getOrElse(k, 0 )) ) } 首先: Scala中现有的合并集合操作不能满足这个需求?。 注意合并后的结果a的G02的值其实

开发中遇到需求:合并两个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,i)=>sum+i) 可以写成 (List(1,3) foldLeft 0)((sum,i)=>sum+i) 语法糖 (0 /: List(1,3))(_+_)  

操作符设计者的脑洞也是够了 -?-?开发者绝对是表情帝

如果接受了这个设定。。。foldRight也可以脑补出来。。?一定是 ?((1 to 5)?:?100)((i,sum)=> sum-i)?.......

另外。一个例子说明 ?foldLeft 和 foldRight:

?最后:?

来说说操作函数中的case??,这个鬼叫模式匹配?(哦对,模式匹配的时候是要有个大括号包起来的?所以最终结果的操作函数使用大括号包着。)

Map的折叠函数是依次传入Map的键值对。所以操作函数希望传入的操作数可以是(K,V)形式。。于是用case表达式:(map,v))

具体模式匹配是什么。。简单说就是scala会尝试将传入的值匹配到case后面表达式的样子(当然这里一定会匹配上,所以没有写case的多余分支)具体什么是“模式匹配”,目前理解尚浅此处暂不深入妄加揣测。

一Try 胜千言?:

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读