scala - 如何在 Scala 中使用 foreach 和 concat 重现 flatMap?
问题描述
我正在尝试使用重新创建flatMap
函数foreach
,List.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()
解决方案
正如我在评论部分提到的,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 中破坏您的程序
推荐阅读
- python - 在 python 3 中以二进制模式打开带有通用换行符的文件
- javascript - 额外的行出现在网格/表格中
- ios - 我将地图设置为旋转到用户位置。如何允许用户与地图交互?
- ios - didSelectRowAt 不适用于我的 UITableViewController
- c# - 使用 Cookie 在 Web API 中配置域
- python - 如何更新代码以显示随机游走?
- excel - 运行时错误 53 file not found for some files in directory
- charts - 谷歌图表没有占用 100% 的空间
- java - android.view.accessibility.AccessibilityNodeInfo.setText 致命异常:java.lang.IndexOutOfBoundsException
- python - Ray 集群配置 file_mounts 部分不允许工作节点启动