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
功能之间有什么区别?来自:
- 地图
- 平面图
“搜索平面地图”-这里有一个很好的解释。(基本上,它是“展平”和“地图”的结合,这是来自其他语言的功能)。这里有一个很好的解释: 以列表为例: 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))