Iterable
的map
函数和flatMap
函数有什么不同
发布于 2009-06-29 20:33:13
这里有一个很好的解释:
http://www.codecommit.com/blog/scala/scala-collections-for-the-easily-bored-part-2
以list为例:
Map的签名是:
map [B](f : (A) => B) : List[B]
而flatMap的是
flatMap [B](f : (A) => Iterable[B]) : List[B]
因此,flatMap采用类型A并返回可迭代类型B,而map采用类型A并返回类型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)
发布于 2009-06-29 20:37:50
以上都是正确的,但还有一件事很方便:flatMap
将List[Option[A]]
转换为List[A]
,并删除任何深入到None
的Option
。这是超越使用null
的一个关键的概念突破。
发布于 2009-06-29 20:38:38
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 comprehensions中更好地看到这一点:
for {line <- lines
word <- line split "\\W+"}
yield word.length
这可以转化为:
lines.flatMap(line => line.split("\\W+").map(word => word.length))
for中的每个迭代器都会被翻译成一个"flatMap",除了最后一个,它会被翻译成一个"map“。这样,您返回平面集合而不是返回嵌套的集合(一组缓冲区的列表)。由正在产生的元素形成的集合--在本例中是一个整数列表。
https://stackoverflow.com/questions/1059776
复制相似问题