Scala ReduceLeft的行为

时间:2018-01-18 16:30:53

标签: scala reduce

在下面的代码片段中,我使用reduceLeft和foreach循环来查找数字与所有列表成员的差异总和。我期待这两个的结果是相同的(1050)但是reduceLeft在最终答案中增加了额外的50(val x)。这背后的原因是什么?

  val list = List(200,400,600)
  val x = 50
  println(list.reduceLeft((total, cur) => total + Math.abs(x - cur)))

  var total = 0l
  list.foreach(p => {
    total = total + Math.abs(x - p)
  })

  println(total)

2 个答案:

答案 0 :(得分:3)

这是因为您没有从列表中的第一个值中减去50。您的reduceLeft函数正在执行此操作:

Iteration 1: 200 + Math.abs(50 - 400)
Iteration 2: 550 + Math.abs(50 - 600)
Result: 1100

尝试使用foldLeft

list.foldLeft(0)((total, cur) => total + Math.abs(50 - cur)) 

答案 1 :(得分:2)

我认为foldLeft可以更清晰,但您仍然可以使用reduceLeft作为初始值,使用0作为初始值:

(0 :: list).reduceLeft((total, cur) => total + Math.abs(x - cur))