scala Iterable #map与Iterable#flatMap

时间:2009-06-29 18:36:12

标签: scala monads scala-collections

map的{​​{1}}和flatMap函数之间有什么区别?

5 个答案:

答案 0 :(得分:55)

以上情况都是正确的,但还有一件事情很方便:flatMapList[Option[A]]变为List[A],其中任何Option都会向下钻取None {1}},已删除。这是超越使用null的关键概念突破。

答案 1 :(得分:43)

这是一个很好的解释:

http://www.codecommit.com/blog/scala/scala-collections-for-the-easily-bored-part-2

以列表为例:

地图的签名是:

map [B](f : (A) => B) : List[B]

和flatMap是

flatMap [B](f : (A) => Iterable[B]) : List[B]

所以flatMap采用类型[A]并返回可迭代类型[B],map采用类型[A]并返回类型[B]

这也可以让您了解flatmap将“扁平化”列表。

val l  = List(List(1,2,3), List(2,3,4))

println(l.map(_.toString)) // changes type from list to string
// prints List(List(1, 2, 3), List(2, 3, 4))

println(l.flatMap(x => x)) // "changes" type list to iterable
// prints List(1, 2, 3, 2, 3, 4)

答案 2 :(得分:8)

来自scaladoc

  • 地图
  

返回可迭代的结果   从应用给定的函数f到   这个可迭代的每个元素。

  • flatMap
  

应用给定的函数f   然后,对于这个可迭代的每个元素   连接结果。

答案 3 :(得分:8)

lines.map(line => line split "\\W+") // will return a list of arrays of words
lines.flatMap(line => line split "\\W+") // will return a list of words

你可以更好地理解这一点:

for {line <- lines
     word <- line split "\\W+"}
yield word.length

这转化为:

lines.flatMap(line => line.split("\\W+").map(word => word.length))

内部的每个迭代器都将被翻译成“flatMap”,除了最后一个,它被翻译成“地图”。这样,您可以返回一个扁平集合,而不是返回嵌套集合(一个blah,blah,blah缓冲区数组的列表)。由产生的元素组成的集合 - 在这种情况下是整数列表。

答案 4 :(得分:3)

看这里: http://www.codecommit.com/blog/scala/scala-collections-for-the-easily-bored-part-2

“搜索flatMap” - 那里有一个非常好的解释。 (基本上它是“flatten”和“map”的组合 - 来自其他语言的功能)。