Lorsque l'on enchaîne plusieurs transformations sur une collection, on crée de nombreuses collections intermédiaires qui sont immédiatement jetées. Par exemple, dans le code suivant :
@ val myArray = Array(1, 2, 3, 4, 5, 6, 7, 8, 9)
@ val myNewArray = myArray.map(x => x + 1).filter(x => x % 2 == 0).slice(1, 3)
myNewArray: Array[Int] = Array(4, 6)
La chaîne de .map
.filter
.slice
finissent par traverser la collection trois fois, créant ainsi trois nouvelles nouvelles collections, mais seule la dernière collection finit par être stockée dans myNewArray
et les autres sont rejetées.
myArray
1,2,3,4,5,6,7,8,9
map(x => x + 1)
2,3,4,5,6,7,8,9,10
filter(x => x % 2 == 0)
2,4,6,8,10
slice(1, 3)
myNewArray
4,6
Cette création et cette traversée de collections intermédiaires constituent un gaspillage. Dans les cas où vous avez de longues chaînes de qui deviennent un goulot d'étranglement au niveau des performances, vous pouvez utiliser la fonction .view
méthode en même temps que .to
à fusible les opérations ensemble :
@ val myNewArray = myArray.view.map(_ + 1).filter(_ % 2 == 0).slice(1, 3).to(Array)
myNewArray: Array[Int] = Array(4, 6)
Utilisation de .view
avant le map/filter/slice
de transformation reporte la traversée réelle et la création création d'une nouvelle collection jusqu'à plus tard, quand nous appelons .to
pour le reconvertir en un type de collection concret :
myArray
1,2,3,4,5,6,7,8,9
view map filter slice to
myNewArray
4,6
Cela nous permet d'effectuer cette chaîne de map/filter/slice
des transformations avec une seule traversée, et ne créer qu'une seule collection de sortie. Cela réduit la quantité de traitements inutiles et les mémoire.