这可能是非常基本的但我肯定在这里遗漏了一些东西。
这都在一个方法中,我在子/子范围内增加/改变一个变量(它可能在if
块内,或者像map
中的map
但是,结果是变量不变。例如在val resultsMap = scala.collection.mutable.Map.empty[String, Long]
resultsMap("0001") = 0L
resultsMap("0003") = 2L
resultsMap("0007") = 1L
var sum = 0L
resultsMap.mapValues(x => {sum = sum + x})
// I first wrote this, but then got worried and wrote more explicit version too, same behaviour
// resultMap.mapValues(sum+=_)
println("total of counts for txn ="+sum) // sum still 0
之后,总和保持为零。然而,它应该达到3L。
我错过了什么?
var cnt : Int = 0
rdd.foreach(article => {
if (<something>) {
println(<something>) // being printed
cnt += 1
println("counter is now "+cnt) // printed correctly
}
})
- 更新 我有类似的行为,其中循环不更新循环外的变量。寻找变量范围的文本,但尚未找到黄金来源。所有的帮助表示赞赏。
public class RecipeListener implements ActionListener{
//rest code
答案 0 :(得分:2)
你应该这样做:
val sum = resultsMap.values.reduce(_+_)
您只需获取values
,然后使用reduce
添加它们。
修改强>:
sum
保持不变的原因是mapValues
生成视图,这意味着(除其他外)新的地图将不会被计算,除非结果视图是采取行动,所以在这种情况下 - 代码块更新总和只是从未执行。
要看到这一点 - 你可以“强制”视图“实现”(计算新地图),并按预期看到总和更新:
var sum = 0L
resultsMap.mapValues(x => {sum = sum + x}).view.force
println("SUM: " + sum) // prints 3
请参阅此处的相关讨论:Scala: Why mapValues produces a view and is there any stable alternatives?