一个非常方便的方法是在元组上使用zipped 方法。放入两个集合,取出一个函数的两个参数!
(ar1,ar2).zipped.foreach((x,y) => println(x+y))
这既方便编写又快速,因为您不需要构建一个元组来存储每一对(就像您使用 (ar1 zip ar2) 所做的那样),然后您必须再次拆开它们。当两个系列中较短的一个用完时,两种形式的拉链都会停止。
如果您有更复杂的事情(例如,您需要对索引进行数学运算),规范的解决方案是压缩索引:
ar1.zipWithIndex.foreach{ case(x,i) => println(x+ar2(i)) }
您使用的方法更快速,更紧凑,如下所示,可能有用:
ar1.indices.foreach(i => println(ar1(i)+ar2(i)))
虽然这仅在第一个集合不长于第二个时才有效。您还可以明确指定您的范围:
(0 until (ar1.size min ar2.size)).foreach(i => println(ar1(i)+ar2(i)))
解决这个问题。 (你可以看到为什么zip 和zipped 是首选,除非你正在做的事情太复杂以至于无法轻松工作。)
如果它不是并行集合(除非您调用 .par,否则通常不是),也可以使用可变变量进行跟踪,但不推荐:
{ var i=-1; ar1.foreach{ x => i += 1; println(x+ar2(i)) } }
有必要这样做的情况非常有限(例如,如果您可能想跳过或回溯某些其他集合);如果你可以避免这样做,你通常会得到更容易推理的代码。