首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >scala Iterable#map与Iterable#flatMap

scala Iterable#map与Iterable#flatMap
EN

Stack Overflow用户
提问于 2009-06-29 18:36:12
回答 4查看 22K关注 0票数 58

Iterablemap函数和flatMap函数有什么不同

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 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)
票数 44
EN

Stack Overflow用户

发布于 2009-06-29 20:37:50

以上都是正确的,但还有一件事很方便:flatMapList[Option[A]]转换为List[A],并删除任何深入到NoneOption。这是超越使用null的一个关键的概念突破。

票数 57
EN

Stack Overflow用户

发布于 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“。这样,您返回平面集合而不是返回嵌套的集合(一组缓冲区的列表)。由正在产生的元素形成的集合--在本例中是一个整数列表。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1059776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档