Scala列表,map和flatMap

Mot*_*taF -1 scala operators

我现在正看着M.Odersky的书中的例子

List.range(1, 5) flatMap (
i => List.range(1, i) map (j => (i, j))
)
Run Code Online (Sandbox Code Playgroud)

好的,首先我们创建1,2,3,4接下来会发生什么的列表?什么是

i => List.range(1, i)
Run Code Online (Sandbox Code Playgroud)

在做什么?创建

(1,1)
(1,2)
(1,3)
(1,4)
Run Code Online (Sandbox Code Playgroud)

是还是不是?

如果我试图逃避flatMap

scala> List.range(1,5) (i => List.range(1,i) map (j => (i, j)))
<console>:11: error: missing parameter type
       List.range(1,5) (i => List.range(1,i) map (j => (i, j)))
Run Code Online (Sandbox Code Playgroud)

为什么?

jwv*_*wvh 6

了解某些代码的一种方法是将其插入REPL,将其分解为组成部分,然后再将它重新组合在一起.

List.range(1,5)  // List(1, 2, 3, 4), pretty simple

List.range(1,5).map(i => i)  // no change (map is simpler than flatMap)

List.range(1,5).map(i => List.range(1, i))
res2: List[List[Int]] = List(List(), List(1), List(1, 2), List(1, 2, 3))
Run Code Online (Sandbox Code Playgroud)

好的,所以原始List的每个元素都成为一个新的子列表.让我们看看是flatMap做什么的.

List.range(1,5).flatMap(i => List.range(1, i))
res3: List[Int] = List(1, 1, 2, 1, 2, 3)
Run Code Online (Sandbox Code Playgroud)

因此,如果map在列表中生成列表,则将其flatMap"展平"为一个列表.

继续使用这种试错法,测试和重新测试方法,您应该能够自己演示代码的其余部分(创建结果元组的位置).