3

If I use xxx.flatMap(_.split(" ")), will it split the array an then flatten or will it flatten and then split?

4

5 回答 5

4

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

因此它将映射可迭代对象(在本例中为拆分),然后展平生成的 2D 可迭代对象(本例中为列表)。

于 2016-05-12T05:14:09.773 回答
2

许多好的答案,但都太长了:)这很简单:在你分裂之前,没有什么可以变平的。

于 2016-05-12T10:31:21.847 回答
1

flatMap 是 map 的组合,然后 flatten。下面的例子可以解释我们调用map然后flatten的过程,结果是一个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)
于 2016-05-12T06:05:33.193 回答
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 ) )

您无法对Some(there)调用 flatMap 的 Option 执行“展平”。“扁平化”只有在我们嵌套了单子上下文时才被定义和有意义,即当考虑一个假设的中间Some(Some(THERE))值时,一个flatten方法将被调用来产生Some(THERE)

于 2016-05-12T05:43:20.783 回答
0

flatMap 可以看作是“map”和“flatten”操作的组合。

至于你的问题,答案是先“分裂”,然后“变平”。

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

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

祝你好运

于 2016-05-12T05:47:37.017 回答