以下for-expression
对我来说似乎很直观。获取List(1)
中的每个项目,然后映射List("a")
,然后返回List[(Int, String)]
。
scala> val x = for {
| a <- List(1)
| b <- List("a")
| } yield (a,b)
x: List[(Int, String)] = List((1,a))
现在,将其转换为flatMap
,我似乎不太清楚。如果我理解正确,我需要先调用flatMap
,因为我正在使用最初的List(1)
,然后应用一个函数来转换A => List[B]
。
scala> List(1).flatMap(a => List("a").map(b => (a,b) ))
res0: List[(Int, String)] = List((1,a))
使用flatMap后,似乎需要使用map
,因为我需要从A => B
开始。
但是,随着for-expression
(例如2到3个项目)中的项目数量增加,我如何知道在转换自{map
时使用flatMap
或for-expression
1}}到flatMap
?
答案 0 :(得分:8)
在使用for comprehension时,您始终flatMap
,直到您提取的最后一个值为map
。所以如果你有三个项目:
for {
a <- List("a")
b <- List("b")
c <- List("c")
} yield (a, b, c)
它将与:
相同 List("a").flatMap(a => List("b").flatMap(b => List("c").map(c => (a, b, c))))
如果您查看flatMap
的签名A => M[B]
。因此,当我们为了理解添加元素时,我们需要flatMap
它们,因为我们继续将M[B]
添加到理解中。当我们到达最后一个元素时,没有什么可以添加的,所以我们使用map
,因为我们只想从A => B
开始。希望这是有道理的,如果没有带你,你应该在Coursera上观看Reactive Programming课程中的一些视频,因为他们会对此进行过多次讨论。