正确解释Scala Map的flatmap表达式

时间:2016-12-01 02:31:49

标签: scala

我正在大力思索,理解从flatMap()操作中产生价值的逻辑:

var topcon = document.getElementsByClassName("topchoice");

function show() {
  var changeColor = "blue";
  if(topcon && topcon.length) {
    if(topcon[0].style.color === "blue") {
      changeColor = "green";
    } else {
      changeColor = "blue";
    }
    for (count=0; count < topcon.length; count++) {
       topcon[count].style.color = changeColor;
    }
  }
};

println 清楚地显示flatMap从输入 Map 中输入一个条目。因此, e._2 是一对列表。我无法弄清楚之后到底发生了什么!

我错过了一个非常重要而微妙的步骤。请赐教。

1 个答案:

答案 0 :(得分:4)

可以认为是:

首先我们映射:

val a = Map("a" -> List(1 -> 11,1 -> 111), "b" -> List(2 -> 22,2 -> 222)).map(e => e._2) 
// List(List((1, 11), (1, 111)), List((2, 22), (2, 222)))

然后我们压扁:

val b = a.flatten
// List((1, 11), (1, 111), (2, 22), (2, 222))

然后我们转换回地图:

b.toMap
// Map(1 -> 111, 2 -> 222)

由于地图不能包含1个键的2个值,因此该值将被覆盖。

真正发生的事情是flatMap正在转换成如下循环:

for (x <- m0) b ++= f(x)

其中:

  • m0是我们原来的地图

  • b是一个集合构建器,必须构建Map,即MapBuilder

  • f是我们传递给flatMap的函数(它返回List[(Int, Int)]

  • x是我们原始地图中的元素

++=函数获取我们从调用f(x)获得的列表,并在每个元素上调用+=,以将其添加到我们的地图中。对于Map+=只需调用原始+运算符Map,如果密钥已存在,则会更新值。

最后,我们在我们的构建器上调用result,它只返回我们的Map