scala Iterable#映射与Iterable#flatMap

scala Iterable#映射与Iterable#flatMap,scala,monads,scala-collections,Scala,Monads,Scala Collections,Iterable的map和flatMap功能之间有什么区别?来自: 地图 返回生成的iterable值 从应用给定函数f到 这个问题的每一个要素都是不可分的 平面图 应用给定的函数f 对于这个iterable的每个元素,那么 连接结果 看这里: “搜索平面地图”-这里有一个很好的解释。(基本上,它是“展平”和“地图”的结合,这是来自其他语言的功能)。这里有一个很好的解释: 以列表为例: Map的签名是: map [B](f : (A) => B) : List[B] 而fla

Iterable
map
flatMap
功能之间有什么区别?

来自:

  • 地图
返回生成的iterable值 从应用给定函数f到 这个问题的每一个要素都是不可分的

  • 平面图
应用给定的函数f 对于这个iterable的每个元素,那么 连接结果

看这里:


“搜索平面地图”-这里有一个很好的解释。(基本上,它是“展平”和“地图”的结合,这是来自其他语言的功能)。

这里有一个很好的解释:

以列表为例:

Map的签名是:

map [B](f : (A) => B) : List[B]
而flatMap的是

flatMap [B](f : (A) => Iterable[B]) : List[B]
因此,flatMap采用类型[a]并返回iterable类型[B],map采用类型[a]并返回类型[B]

这也会让您了解flatmap将“展平”列表


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

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

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

我正在寻找更多的分析/解释。好的,把你的问题改得更具体一些。说出你已经知道的,以及你需要澄清的。我更喜欢你尖刻的评论。我也是,但我认为谨慎是勇气的更好部分:)有趣的是,根据一元公理,
l flatMap{x=>x}
恰好等同于
l.flatte
。FlatMap相当于Scala的一元
bind
操作(>>=在Haskell中)。我发现它对非集合单子(如Option)最有用。当与集合结合使用时,它对于实现“嵌套映射循环”最为有用,从而返回一个集合。使用选项链接比使用if(x!=null和x.foo!=null)之类的语句要好得多。详细讨论了这一点println(l.flatMap(x=>x))这不再起作用,需要像这样使用flatMap:啊,这是我从未想过的另一个很好的选项技巧。我刚刚有一个方法返回一个或多个东西的列表,从未见过
选项。toList
方法:list(Some(“foo”)、None、Some(“bar”)。flatMap(u.toList)或者更好的方法,将
选项.toIterator
与Tristan的方法结合使用,以便在必要时不迭代整个列表。
for {line <- lines
     word <- line split "\\W+"}
yield word.length
lines.flatMap(line => line.split("\\W+").map(word => word.length))