首页 > 解决方案 > 如何在 Scala 中使用 foreach 和 concat 重现 flatMap?

问题描述

我正在尝试使用重新创建flatMap函数foreachList.concat但结果列表似乎没有变化。

这是参考:

val rdd: List[String] = List("Hello sentence one",
                             "This is the next sentence",
                             "The last sentence")
val fm: List[String] = rdd.flatMap(s => s.split("\\W"))
println(fm)

这使:

List(Hello, sentence, one, This, is, the, next, sentence, The, last, sentence)

这是我重新创建相同的方法:

val nonRdd: List[String] = List("Hello sentence one",
                                "This is the next sentence",
                                "The last sentence")
var nonfm: List[String] = List()
nonRdd.foreach(line => List.concat(nonfm, line.split("\\W")))
println("nonfm: " + nonfm)

因此,每一行都在 word 上拆分,并且应该将生成的中间行连接到先前初始化的 list nonfm

然而,nonfm是空的:

nonfm: List()

标签: scala

解决方案


正如我在评论部分提到的,List在 Scala 中将默认为scala.collection.immutable

正如文档所暗示的那样, concat 返回一个新列表而不是改变原始列表(它无论如何都不能,因为它是不可变的)

返回一个新序列,其中包含左侧操作数中的元素,后跟右侧操作数中的元素。

因此,您需要在每次迭代时通过简单的赋值更新变量

val nonRdd: List[String] = List("Hello sentence one",
                                "This is the next sentence",
                                "The last sentence")
var nonfm: List[String] = List()
nonRdd.foreach(line => nonfm = List.concat(nonfm, line.split("\\W")))
println("nonfm: " + nonfm)

根据 RDD 这个词的使用,我猜你最终会使用 Spark。我希望您只是在尝试并试图了解事情是如何工作的,但请不要 在 Spark(或一般的 Scala 中)中使用变量。请参阅@Avishek 的答案,了解他们为什么会在 Spark 中破坏您的程序


推荐阅读