我正在大力思索,理解从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 是一对列表。我无法弄清楚之后到底发生了什么!
我错过了一个非常重要而微妙的步骤。请赐教。
答案 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
。