我有这个问题:我想对满足特定条件的数组元素进行迭代。
我首先要做的是在原始数组上使用 filter 方法,然后遍历结果元素。但是我对此有一些内存使用问题,即Java堆空间。 当 filter 应用于数组时,它将实例化一个新数组吗?它将复制每个元素吗?
使用这种方法更好吗:
array.filter(<condition>).foreach{ element =>
do something
}
还是以下一个?
for(i <- array.indices if <condition>){
do something
}
此外,我编写了以下两个测试:
使用 for
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)
}
带有 filter
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)
}
我检查了VisualVM的内存使用情况,似乎第一种解决方案使用的内存少于第二种解决方案。
答案 0 :(得分:6)
for
表达式使用withFilter
方法而不是filter
,这避免了创建中间Array
。因此,要么使用for
版本,要么使用withFilter
而不是filter
。