Scala:使用过滤器对每个数组进行过滤

Gag*_*a88 5 arrays scala filter

我有这个问题:我想迭代满足特定条件的数组元素。

我的第一件事是在原始数组上使用filter方法,然后遍历结果元素。但是我有一些内存使用问题,即Java堆空间。将过滤器应用于数组时,它将实例化一个新数组吗?那么它将复制每个元素吗?

使用这种方法更好吗:

array.filter(<condition>).foreach{ element =>
   do something
}
Run Code Online (Sandbox Code Playgroud)

还是下面的一个?

for(i <- array.indices if <condition>){
   do something
}
Run Code Online (Sandbox Code Playgroud)

此外,我编写了以下两个测试:

随着

val size = 10000000
val elements = Array.ofDim[Double](size)
for (i <- elements.indices) {
  elements.update(i, math.random)
}
var cont = 0
val n = 0.5
while(true){
  cont = 0
  for (j <- elements.indices if elements(j) < n) {
    cont += 1
  }
  println(cont)
}
Run Code Online (Sandbox Code Playgroud)

过滤器

val size = 10000000
val elements = Array.ofDim[Double](size)
for (i <- elements.indices) {
  elements.update(i, math.random)
}

val n = 0.5
while(true){
  val valid = elements.filter(x => x < n)
  println(valid.size)
}
Run Code Online (Sandbox Code Playgroud)

并且我使用VisualVM检查了内存使用情况,似乎第一种解决方案使用的内存少于第二种解决方案。

这是第一个解决方案使用的内存 在此处输入图片说明

这是第二个解决方案使用的内存 在此处输入图片说明

Tim*_*Tim 6

for表达式使用withFilter而不是方法filter,这避免了创建中间方法Array。因此,请使用for版本或使用withFilter而不是filter