zoukankan      html  css  js  c++  java
  • 从合并两个Map说开去

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

  • 相关阅读:
    JQuery[07]Dom操作
    系统钩子[02] 安装全局鼠标钩子
    [Java动态代理] 设计模式之代理模式
    对话框编程之模态对话框 [03]
    对话框编程之属性对话框 [05]
    [Java反射机制] 通过反射机制创建类的实例并调用其方法
    JQuery[06] 过滤器、相对选择器
    JQuery[04] 节点遍历
    JQuery[13] Ajax的简单应用
    JQuery[09] CSS样式操作/节点操作
  • 原文地址:https://www.cnblogs.com/itboys/p/10626372.html
Copyright © 2011-2022 走看看