Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
scala:以函数方式从集合中累积变量(即,无变量)_Scala_Collections_Loops - Fatal编程技术网

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

scala:以函数方式从集合中累积变量(即,无变量),scala,collections,loops,Scala,Collections,Loops,这是一个新手问题 我有以下代码: var total = 0L docs.foreach(total += _.length) 在文档中,我有一组具有.length属性的对象 我想要一些像: val total = docs.[someScalaMethod](0, (element, acum) => acum + element.length ) 我的意思是,一个迭代每个元素并传递累加器变量的方法 我传递的第一个零应该是累加器变量的初始值 怎样才能实现呢?这就是所谓的折叠。这几乎和

这是一个新手问题

我有以下代码:

var total = 0L
docs.foreach(total += _.length)
在文档中,我有一组具有.length属性的对象

我想要一些像:

val total = docs.[someScalaMethod](0, (element, acum) => acum + element.length )
我的意思是,一个迭代每个元素并传递累加器变量的方法

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


怎样才能实现呢?

这就是所谓的折叠。这几乎和你说的一模一样:

docs.foldLeft(0)((accum, element) => accum + element.length)
对于从左到右遍历集合的版本(通常更可取;从右到左是
foldRight
,2.9有一个
fold
,可以从任何地方开始,但对如何转换类型有限制)

一旦你习惯了这一点,就会有一个简短版本的fold left,累加器放在左边(想象一下它在列表中从左到右被推),并且你会使用占位符作为变量名,因为每个变量名只使用一次:
(0/:docs)(+.length)

或者(thx去了路易吉·普林奇)


以下是Scalaz版本:

docs.foldMap(_.length)

这相当于
docs.map(u.length).sum
,但只需要一次。而且,它可以与所有人一起工作

你可能也会觉得有用,但鉴于你的问题,你似乎完全知道你需要什么,所以你不需要教程——你只需要知道该方法的调用。我最终决定使用val docsLength=if(docs.length==0)0 else docs.map(u.length)。sum,但所有答案都非常有用
docs.map(u.length).sum
将做完全相同的事情;if/else是
sum
的默认行为。是的,我测试了它,你是对的……请注意,如果
docs
为空,这将失败,但这是一个不错的策略。对于scala 2.9.1和第一个选项,我得到以下错误:value reduce不是数组[Long]val translatedLength=translated map{reduce{{{u+}@opensas-我很确定这里又有了2.8。在2.9.1上对我来说效果很好。你说得对,雷克斯,我再试了一次,效果很好,谢谢。数组不存在fold方法(嗯,这就是我得到的错误)必须使用foldLeft,并且还指定0L一个初始值,比如:docs.foldLeft(0L)((acum,ele)=>acum+ele.length)@opensas-我猜你使用的是旧版本的Scala<代码>折叠是在2.9中引入的,我记得。在此之前,只有左版本和右版本。没错,scala-版本scala code runner版本2.8.1.final--版权所有2002-2010,LAMP/EPFL尝试使用2.9.1.final,我得到以下错误:错误:值fold不是数组的成员[this.DocumentationFile]val translatedLength=translated.fold(0L)((acum,element)=>acum+element.length)@opensas-我的错误。我忘了,
fold
不能以那种方式更改返回类型。
docs.map(_.length).sum
docs.foldMap(_.length)