scala Iterable#map 与 Iterable#flatMap

发布于 2024-07-25 16:36:23 字数 79 浏览 7 评论 0原文

IterablemapflatMap 函数有什么区别?

What is the difference between the map and flatMap functions of Iterable?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

放飞的风筝 2024-08-01 16:36:23

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

The above is all true, but there is one more thing that is handy: flatMap turns a List[Option[A]] into List[A], with any Option that drills down to None, removed. This is a key conceptual breakthrough for getting beyond using null.

窝囊感情。 2024-08-01 16:36:23

这是一个很好的解释:

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]

这也会让你知道 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)

Here is a pretty good explanation:

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

Using list as an example:

Map's signature is:

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

and flatMap's is

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

So flatMap takes a type [A] and returns an iterable type [B] and map takes a type [A] and returns a type [B]

This will also give you an idea that flatmap will "flatten" lists.

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)
烟花肆意 2024-08-01 16:36:23

来自 scaladoc

  • 地图

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

  • 平面地图

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

From scaladoc:

  • map

Returns the iterable resulting
from applying the given function f to
each element of this iterable.

  • flatMap

Applies the given function f
to each element of this iterable, then
concatenates the results.

烟酉 2024-08-01 16:36:23
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 推导式中更好地看到这一点:

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

这转换为:

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

for 中的每个迭代器都将被转换为“flatMap”,除了最后一个迭代器,它被转换为“map”。 这样,您将返回一个平面集合,而不是返回嵌套集合(等等缓冲区的数组列表)。 由正在生成的元素形成的集合——在本例中是整数列表。

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

You can see this better in for comprehensions:

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

this translates into:

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

Each iterator inside for will be translated into a "flatMap", except the last one, which gets translated into a "map". This way, instead of returning nested collections (a list of an array of a buffer of blah, blah, blah), you return a flat collection. A collection formed by the elements being yield'ed -- a list of Integers, in this case.

慈悲佛祖 2024-08-01 16:36:23

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

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

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

"Search for flatMap" - there is a really good explanation of it there. (Basically it is a combination of "flatten" and "map" -- features from other languages).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文