我现在正看着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)
为什么?
了解某些代码的一种方法是将其插入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"展平"为一个列表.
继续使用这种试错法,测试和重新测试方法,您应该能够自己演示代码的其余部分(创建结果元组的位置).