阅读此article并意识到在yield
关键字之后的几乎所有功能都是map
功能。 for
中的所有语句都是flatMap
函数。为什么呢?为什么yield
之后的函数是flatMap
函数,而for
中的函数又是map
函数?
答案 0 :(得分:1)
您的第一点大致正确。声明
for (x <- list) yield f(x)
等同于
list.map(x => f(x))
但是当列表不止一个时,如何使用flatMap
并不完全正确。
如果要同时遍历另一个列表,则使用flatMap
调用:
for (
x <- list1
y <- list2
) yield f(x, y)
这等效于
list1.flatMap(x => list2.map(y => f(x, y)))
map
调用被包装在flatMap
调用中,因此结果是一个简单列表。如果外部调用为map
,则结果将为嵌套列表。
内部调用始终是map
调用,所有外部调用都是flatMap
。所以
for (
x <- list1
y <- list2
z <- list3
) yield f(x, y, z)
是
list1.flatMap(x => list2.flatMap(y => list3.map(z => f(x, y, z))))
最后,for
最好的用途是对其进行试验,直到它达到您想要的效果为止,一段时间后它将变得直观。