scala Iterable#map与Iterable#flatMap

IterablemapflatMap函数有什么区别?

这是一个很好的解释:

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需要一个types[A]并返回一个可迭代的types[B],而map需要一个types[A]并返回一个types[B]

这也将给你一个平面图将“扁平化”列表的想法。

 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) 

以上都是真实的,但还有一件事情是方便的: flatMapList[Option[A]]转换为List[A] ,任何可以深入到None Option移除。 这是超越使用null的关键概念性突破。

从scaladoc :

  • 地图

返回将给定函数f应用于此迭代器的每个元素所产生的迭代。

  • flatMap

将给定函数f应用于此迭代器的每个元素,然后连接结果。

 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”,除了最后一个被翻译成“map”之外。 这样,而不是返回嵌套的集合(blah,blah,blah的缓冲区的数组列表),您返回一个平面集合。 由yielded的元素组成的集合 – 在这种情况下是整数列表。

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

“寻找flatMap” – 这里有一个很好的解释。 (基本上它是“拼合”和“地图”的组合 – 来自其他语言的特征)。