У меня есть такая проблема: я хочу перебрать элементы массива, которые удовлетворяют определенному условию.
Первое, что я хочу сделать, - это использовать метод filter в оригиналемассив, а затем перебирает полученные элементы. Но у меня были некоторые проблемы с использованием памяти, то есть пространство кучи Java. Когда фильтр применяется к массиву, он будет создавать новый массив? Таким образом, он будет копировать каждый элемент?
Лучше ли использовать этот подход:
array.filter(<condition>).foreach{ element =>
do something
}
Или следующий?
for(i <- array.indices if <condition>){
do something
}
Более того, я написал эти дватесты:
с для
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)
}
с фильтром
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, похоже, что первое решение использует меньше памяти, чем второе.
Это память, используемая первым решением
Это используемая памятьпо второму решению