Scala 之 合并两个map
2017-09-26 13:57
288 查看
转自:http://www.cnblogs.com/tugeler/p/5134862.html
开发中遇到需求:合并两个Map集合对象(将两个对应KEY的值累加)
先说解决方案:
这特么什么鬼 (╯‵□′)╯""┻━┻☆))>○<) 。。。。。。莫急,且听我慢慢道来。。。。。。。。。
首先:
Scala中现有的合并集合操作不能满足这个需求 。
注意合并后的结果a的G02的值其实是被覆盖掉了。。
然后:
说说那个表达式中(a /:
b)( ... ) 这部分是什么鬼。这个其实是scala简化的foldLeft函数。
先看foldLeft
List(1,2,3).foldLeft(0)((sum,i)=>sum+i) // 红色部分是初始值,蓝色部分是操作函数
操作符设计者的脑洞也是够了 - - 开发者绝对是表情帝
如果接受了这个设定。。。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集合对象(将两个对应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 胜千言 :
相关文章推荐
- scala - 从合并两个Map说开去 - foldLeft 和 foldRight 还有模式匹配
- java8 lambda小试牛刀,利用Stream把list转map,并将两个list的数据对象合并起来
- 两个Map合并
- 第十章 Scala 容器基础(二十三):使用zip合并两个集合为二元组集合
- java8 lambda小试牛刀,利用Stream把list转map,并将两个list的数据对象合并起来
- Java_集合操作_合并两个map
- Clojure:将两个list合并成一个map
- scala使用zip合并两个集合为二元组集合
- java 两个map对象的合并成一个map对象
- scala将两个数组合并成一个
- 用Java实现线性表中的顺序存储的学习和源码(合并两个线性表)
- 合并两个类型相同的List
- 源码]java合并两个文件,hashtable去重。
- RxJava 合并组合两个(或多个)Observable数据源
- 合并两个结构相同的DataTable
- mysql union, union all合并两个结果集
- STM32两个hex文件合并问题
- Scala学习第六天 Map、Tuple、Zip实战解析
- 02-线性结构1 两个有序链表序列的合并 (15分)
- Scala的cons,集合合并与添加