【问题标题】:Scala lists,map and flatMapScala 列表、地图和平面地图
【发布时间】:2017-07-30 23:36:57
【问题描述】:

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

List.range(1, 5) flatMap (
i => List.range(1, i) map (j => (i, j))
)

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

i => List.range(1, i)

在做什么?创造

(1,1)
(1,2)
(1,3)
(1,4)

是还是不是?

如果我试图避开 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)))

为什么?

【问题讨论】:

  • 它是(i =&gt; ((List.range(1, i)) map (j =&gt; (i, j))))。所以 no,而表达式 i =&gt; List.range(1, i) 不是完整代码的一部分
  • 这个问题与“运算符优先级”无关。为什么选择这个标题?
  • @jwvh 我已经改了标题,我想了解代码步骤。

标签: scala operators


【解决方案1】:

加深对某些代码的理解的一种方法是将其插入 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))

OK,原来List的每一个元素都变成了一个新的子List。让我们看看flatMap 做了什么。

List.range(1,5).flatMap(i => List.range(1, i))
res3: List[Int] = List(1, 1, 2, 1, 2, 3)

因此,如果map 在一个列表中生成列表,那么flatMap 会将其全部“展平”为一个列表。

继续使用这种反复试验、测试和重新测试的方法,您应该能够自己演示其余代码在做什么(这是创建结果元组的地方)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-06
    • 2020-07-06
    • 1970-01-01
    • 1970-01-01
    • 2020-12-19
    • 1970-01-01
    • 2020-10-26
    • 1970-01-01
    相关资源
    最近更新 更多