scala:以函数方式从集合中累积var(即,没有变量)

ope*_*sas 15 collections loops scala

这是一个新手问题

我有以下代码:

var total = 0L
docs.foreach(total += _.length)
Run Code Online (Sandbox Code Playgroud)

在docs中我有一组带有.length属性的对象

我喜欢这样的东西:

val total = docs.[someScalaMethod](0, (element, acum) => acum + element.length )
Run Code Online (Sandbox Code Playgroud)

我的意思是,一个迭代每个元素传递累加器变量的方法......

我传递的第一个零应该是累加器var的初始值.

如何实现?

Rex*_*err 22

这称为折叠.这几乎就是你所说的:

docs.foldLeft(0)((accum, element) => accum + element.length)
Run Code Online (Sandbox Code Playgroud)

对于从左到右遍历集合的版本(通常更可取;从右到左是foldRight,而2.9有一个fold可以从任何地方开始,但在如何转换类型方面有限制).

一旦你习惯了这个,就会有一个简短的折叠版本,其中累加器在左边(想想它是从左到右穿过列表),并且你使用占位符作为变量名称,因为你每次只使用一次: (0 /: docs)(_ + _.length)

  • @opensas - 我猜你正在使用旧版本的Scala; 我记得在2.9中引入了"fold".在此之前,只有左右版本. (2认同)

agi*_*eel 8

docs map { _.length } reduce { _ + _ }
Run Code Online (Sandbox Code Playgroud)

或者(thx去Luigi Plinge)

docs.map(_.length).sum
Run Code Online (Sandbox Code Playgroud)

  • `docs.map(_.length).sum` ...这是2011年! (10认同)