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
,它会在每个项目上运行您的转换并吐出一个新的可迭代结果。
我刚开始使用 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
,它会在每个项目上运行您的转换并吐出一个新的可迭代结果。