开发中遇到需求:合并两个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. How to select a OptionSet on ms sqlserver database for Microsoft Dynamics CRM

    OptionSet: Select * from StringMap Global OptionSet: select  os.Name, l.Label from AttributePicklist ...

  2. 一切皆WEB

    所有应用都应该成为Web应用吗?当然不是.总有一些重要的例外,有些种类的软件跟网络也毫无关系.但是,这些是少数情况,是一些特殊应用.它们固然是重要的小生态环境,但不管怎么说,就只是“小生态”. 如果你 ...

  3. Struts一张图

  4. iframe与include的区别

    iframe与include区别和使用问题 1.iframe可以用在静态和动态页面,include只能用在动态页面. 2.iframe是视图级组合,include是代码级组合. 3.iframe独立成 ...

  5. DoctorNote医生处方笔记开发记录

    1.开发背景 一个开诊所的中医朋友,希望我能给他开发一个记录病人姓名和处方的Android手机app,以便查询病人每次就诊信息,比如上一次的处方,以前他要找个病人上一次的就诊处方,几乎要翻遍一叠厚厚的 ...

  6. 拼接<a>标签相关属性

    <s:iterator value="#session.funcs" id="sonbean"> <s:if test="%{#so ...

  7. UVa 497 - Strategic Defense Initiative

    题目:最大上升子序列.输出一组解. 分析:dp,LIS.数据较小 O(n^2)算法就可以. 设以第i个数字作为最大上升子序列中的最后一个数的长度为 f(i),则有转移方程: f(i)= max(f(j ...

  8. PagerSlidingTabStrip

    https://github.com/jpardogo/PagerSlidingTabStrip     

  9. tr 命令 操作字符串中字符 删除替换 等

    ip=$(cat ${path}initOauth/initinfo.txt |awk '{if(NR==1)print $0;}'|tr -d '\r'); tr命令可以对来自标准输入的字符进行替换 ...

  10. [分享]Ubuntu12.04安装基础教程(图文)

    [分享]Ubuntu12.04安装基础教程(图文) 原文地址: http://teliute.org/linux/Ubsetup/lesson21/lesson21.html 1.进入 live cd ...