scala Iterable#map与Iterable#flatMap
Iterable
的map
和flatMap
函数有什么区别?
这是一个很好的解释:
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)
以上都是真实的,但还有一件事情是方便的: flatMap
将List[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” – 这里有一个很好的解释。 (基本上它是“拼合”和“地图”的组合 – 来自其他语言的特征)。