开发中遇到需求:合并两个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()((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 胜千言 :


参考

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

scala - 从合并两个Map说开去 - foldLeft 和 foldRight 还有模式匹配的更多相关文章

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

    开发中遇到需求:合并两个Map集合对象(将两个对应Key的值累加) 先说解决方案: ( map1 /: map2 ) { )) ) } 首先: Scala中现有的合并集合操作不能满足这个需求 . 注意 ...

  2. scala 两个map合并,key相同时value相加/相减都可

    scala 两个map合并,key相同时value相加 1.map自带的合并操作 2.map函数 2.1示例 2.2合并两个map 3.用foldLeft 3.1 语法 3.2 合并两个map 1.m ...

  3. Java 将两个Map对象合并为一个Map对象

    实现方式是通过 putAll() 方法将多个 map 对象中的数据放到另外一个全新的 map 对象中,代码如下所示,展示了两个 map 对象的合并,如果是多个 map 合并也是用这种方式. publi ...

  4. Clojure:将两个list合并成一个map

    假设我们有两个list,分别是: (def a [“one” “two” “three”]) (def b [1 2 3]) 我们要把它们合为一个键值对应的map,做法很简单: 1. 先将a和b合为一 ...

  5. 两个map合并

    两个map合并所用函数为:putAll package myProject; import java.util.HashMap; import java.util.Map; public class ...

  6. 如何用 Git 合并两个库,并保留提交历史

    转载自 https://segmentfault.com/a/1190000000678808 背景 一个中型规模项目,开始规划时就打算采用 C/S 架构,后端是单纯的 API 服务,前端在 Web ...

  7. 两个map一个reduce(两个输入文件)

    两个map,一个map读取一个hdfs文件,map完之后进入一个reduce进行逻辑处理. package com.zhongxin.mr; import org.apache.commons.lan ...

  8. [leetcode]21. Merge Two Sorted Lists合并两个链表

    Merge two sorted linked lists and return it as a new list. The new list should be made by splicing t ...

  9. 编写Spark的WordCount程序并提交到集群运行[含scala和java两个版本]

    编写Spark的WordCount程序并提交到集群运行[含scala和java两个版本] 1. 开发环境 Jdk 1.7.0_72 Maven 3.2.1 Scala 2.10.6 Spark 1.6 ...

随机推荐

  1. [读书笔记]算法(Sedgewick著)·第一章(1)

    到家放松放松之后就开始学习算法了,手里拿的是拿的是一本Robert Sedgewick的橙皮书<算法(第四版)>的.这本书与导论那本书的不同之处在于轻数学思想.重实现,也就是说这是一本很不 ...

  2. Java同步块(synchronized block)使用详解

    Java 同步块(synchronized block)用来标记方法或者代码块是同步的.Java同步块用来避免竞争.本文介绍以下内容: Java同步关键字(synchronzied) 实例方法同步 静 ...

  3. 关于arm处理器 内存编址模式 与 字节对齐方式 (转)

    转自:http://bavon.bokee.com/5429805.html 在x86+Linux上写的程序,在PC机上运行得很好.可是使用ARM的gcc进行交叉编译,再送到DaVinci目标板上运行 ...

  4. oc学习之路----QQ聊天界面

    用到的技术:自定义cell,通知机制,代理模式 transform 1.自定义cell(通过代码自定义cell) ①首先新建一个类继承UITableViewCell ②重写initWithStyle: ...

  5. void,extern,sizeof

    高手潜规则:禁用goto 程序质量与goto出现次数成反比 void指针的意义 1.C语言规定只有相同类型的指针才可以相互赋值 2.void*指针作为坐值用于"接收"任意类型的指针 ...

  6. javascript中使用md5函数

    javascript中使用md5函数 这对于js来讲本来是没有的,现在可以自己定义一个md5的函数,达到加密效果. var hexcase = 0; function hex_md5(a) { if ...

  7. windows 下安装elasticsearch

    1.下载 elasticsearch-2.3.3.zip 注意::elasticsearch 版本太高的话,java运行不起来 elasticsearch-1.5.2下载地址 http://downl ...

  8. IIS7错误:“Web服务器被配置为不列出此目录的内容”的解决办法

    IIS7错误:“Web服务器被配置为不列出此目录的内容”的解决方法: 在"操作"下,点启用,此按钮将变成禁用,则可消除此错误

  9. android FakeWindow的小应用大用途

    android FakeWindow的小应用大用途 在windowmanager里面有一个FakeWindow,细致一看也就是一个透明的应用覆盖到屏幕的最前端,这样有什么优点呢?首先我们还是从应用的需 ...

  10. [Webpack 2] Optimize React size and performance with Webpack production plugins

    You can fine tune several webpack plugins to make your bundle as small as it can be for your specifi ...