Je suis assez nouveau à Scala mais j'aime savoir quelle est la meilleure façon de résoudre ce problème. Dites que j'ai une liste d'articles et que je veux connaître le montant total des articles qui sont des chèques. Je pouvais faire quelque chose comme ceci:Scala vals vs vars
val total = items.filter(_.itemType == CHECK).map(._amount).sum
qui me donnerait ce que je dois, la somme de tous les chèques dans une variable immuable. Mais il le fait avec ce qui semble être 3 itérations. Une fois pour filtrer les contrôles, encore une fois pour cartographier les montants puis la somme. Une autre façon serait de faire quelque chose comme:
var total = new BigDecimal(0)
for (
item <- items
if item.itemType == CHECK
) total += item.amount
Cela me donne le même résultat mais avec 1 itération et une variable mutable qui semble bien aussi. Mais si je voulais extraire plus d'informations, disons le nombre total de vérifications, cela nécessiterait plus de compteurs ou de variables modifiables, mais je n'aurais pas à recommencer à parcourir la liste. Cela ne semble pas être la manière "fonctionnelle" de réaliser ce dont j'ai besoin.
var numOfChecks = 0
var total = new BigDecimal(0)
items.foreach { item =>
if (item.itemType == CHECK) {
numOfChecks += 1
total += item.amount
}
}
Donc, si vous vous trouvez avoir besoin d'un tas de compteurs ou totaux sur une liste est-il préférable de garder les variables mutables ou vous inquiétez pas à ce sujet faire quelque chose le long des lignes de:
val checks = items.filter(_.itemType == CHECK)
val total = checks.map(_.amount).sum
return (checks.size, total)
qui semble plus facile à lire et utilise uniquement vals
L'expression 'for' est en fait compilée en' map', en 'filter' et en' foreach', ce qui équivaut à votre premier exemple. – Theo
Ce n'est plus précis: le pour la compréhension utilise withFilter, pas de filtre, sauf si la collection n'a pas de méthode withFilter. – extempore