【发布时间】:2018-06-17 15:42:09
【问题描述】:
我正在学习 Scala,我对一个简单的问题的输出感到困惑 求范围内偶数的平方和。
代码片段 1:
val rangeOfNumbers = (1 to 5)
val listOfNumbers = rangeOfNumbers.toList
val squaresOfEvenNumbers = listOfNumbers
.filter(element => element % 2 == 0)
.reduce((total, element) => total+ (element * element))
println(squaresOfEvenNumbers)
Outputs: 18 -> which is clearly wrong
**EDIT** - Simulation:
I want to square the filtered even numbers - 2,4 and then add them to total variable
1: (total = 0, elem = 2) => 0 + (2 * 2) = 4
2. (total = 4, elem = 4) => 4 + (4 *4 ) = 20
Isn't this the expected behavior?
代码片段 2:
val rangeOfNumbers = (1 to 5)
val listOfNumbers = rangeOfNumbers.toList
val filteredEvenNumberSquaredList = listOfNumbers
.filter(element => element % 2 == 0)
.map(evenEle => evenEle * evenEle)
.reduce((total, square) => total + square)
println(filteredEvenNumberSquaredList)
Outputs: 20 -> which is correct
你能解释一下第一种方法有什么问题吗?内部发生了什么?
【问题讨论】:
-
是什么让您期望
total在第一次调用时为 0?你没有将0传递给reduce任何地方......它怎么可能猜到你的意思? -
我做了一个假设,它会初始化为零。似乎是错误的假设
标签: java scala mapreduce scala-collections