哪个首先发生在flatMap,flatten或map中?

时间:2016-05-12 05:08:35

标签: arrays scala flatmap

如果我使用xxx.flatMap(_.split(" ")),它会将数组分开然后变平,还是会变平然后分裂?

5 个答案:

答案 0 :(得分:2)

flatmap函数的目的是获取一个返回列表的函数,然后展平结果。

因此它将映射iterable(在这种情况下分割),然后展平生成的2D iterable(在本例中为List)。

答案 1 :(得分:1)

让我们稍微扩展一下。首先,让我们用我认为你想要的那种例子定义你的xxx

val xxx = Array("hello there 马慧超", "how are you", "nice to meet you")

现在,让我们更长时间地写出你的逻辑:

def words( str : String ) : Array[String] = str.split(" ")
xxx.flatMap( string => words(string) )

我们从一系列字符串开始。在某个中间点,函数words在每个直接字符串上调用,产生Array[String],因此从概念上讲,我们有一系列字符串数组。

但我们最终只得到一系列的弦乐,"扁平化"因为单词数组的中间序列中的每个单词都成为一个长数组的一部分。

因此,从概念上讲,首先我们执行该映射函数(words,或者更直接地split),然后我们展平。

所以,要直接回答你的问题,然后拆分然后展平。

更新(更多,'因为没有?)

它甚至不清楚它对于“平坦”是什么意思。一系列字符串,但非正式地,您可能会先想象连接。我们可以很容易地证明这不是通过仪器发生的事情。如果你试试

def words( str : String ) : Array[String] = {println(str); str.split(" ")}
xxx.flatMap( string => words(string) )

您将看到所有单独的字符串,而不是一个串联的字符串。

对于使用flatMap方法的其他类型,这在逻辑上是必需的。对于

Some("there").flatMap( str => Some( str.toUpperCase ) )

没有"扁平化"您可以在调用flatMap的Option Some(there)上执行。 "平坦化"只有在我们有嵌套的monadic上下文时才会定义和有意义,即在考虑假定的Some(Some(THERE))方法将被调用以产生flatten时的假设中间Some(THERE)值。

答案 2 :(得分:1)

flatMap是地图然后展平的组合。下面的例子可以解释我们调用map然后展平的过程,结果是List [Char],而flatMap直接将Seq转换为List [Char]。

val avengers = Seq("Ironman", "Thor", "Captain America")
val capsAvengers = avengers.map(_.toUpperCase)
println(avengers)
println(capsAvengers)
println(capsAvengers.flatten)
println(avengers.flatMap(.toUpperCase))

结果:

List(Ironman, Thor, Captain America)

List(IRONMAN, THOR, CAPTAIN AMERICA)

List(I,R,O,N,M,A,N,T,H,O,R,C,A,P,T,A,I,N, ,A,M,E,R,I,C,A)

List(I,R,O,N,M,A,N,T,H,O,R,C,A,P,T,A,I,N, ,A,M,E,R,I,C,A)

答案 3 :(得分:1)

许多好的答案,但都太长了:) 它非常简单:在分裂之前,没有什么可以扁平化。

答案 4 :(得分:0)

flatMap可以看作是操作' map'的组合。并且' flatten'。

关于您的问题,答案是' split'首先然后“变平”。

以下示例用于说明这一点:

val nestedNumbers = List(List(1, 2), List(3, 4))

nestedNumbers.flatMap(x => x.map(_ * 2))

输出

res0: List[Int] = List(2, 4, 6, 8)

,相当于以下代码:

nestedNumbers.map((x: List[Int]) => x.map(_ * 2)).flatten

,其输出也是

res0: List[Int] = List(2, 4, 6, 8)

参考就在那里 https://twitter.github.io/scala_school/zh_cn/collections.html#flatMap

祝你好运