Scala 实践:列表和大小写 类

Scala practices: lists and case classes

我刚开始使用 Scala/Spark 并且有 Java 的背景,但我仍在努力思考不可变性的概念和 Scala 的其他最佳实践。

这是一个较大程序中的一小段代码:
交叉点是 RDD(Key, (String, String))
obs 是 (Key, (String, String))
数据只是我上面定义的一个案例class

val intersections = map1 join map2
var listOfDatas = List[Data]()
intersections take NumOutputs foreach (obs => {
  listOfDatas ::= ParseInformation(obs._1.key, obs._2._1, obs._2._2)
})

listOfDatas foreach println

这段代码可以工作并且可以完成我需要它做的事情,但我想知道是否有更好的方法来实现这一点。我正在使用一个变量列表并在每次迭代时用一个新列表重写它,我确信必须有更好的方法来创建一个不可变列表,该列表填充了 ParseInformation 方法调用的结果。另外,我记得在某处读过,而不是像我那样直接访问元组值,你应该在函数中使用 case classes(我认为是部分函数?)以提高可读性。

提前感谢您的任何意见!

intersections 的类型是什么?看起来您可以将 foreach 替换为 map:

val listOfDatas: List[Data] =
  intersections take NumOutputs map (obs => {
    ParseInformation(obs._1.key, obs._2._1, obs._2._2)
  })

这可能在本地有效,但这只是因为您是在本地 take。由于 listOfDatas 作为副本传递给每个工作人员,因此一旦分发它就不会工作。执行此 IMO 的更好方法是:

val processedData = intersections map{case (key, (item1, item2)) => {
  ParseInfo(key, item1, item2)
}}

processedData foreach println

函数式开发新手注意事项:如果您要做的只是在可迭代 (List) 中转换数据,请忘记 foreach。请改用 map,它会在每个项目上运行您的转换并吐出一个新的可迭代结果。