Ich bin ziemlich neu in Scala, aber ich mag es zu wissen, was die bevorzugte Lösung dieses Problems ist. Angenommen, ich habe eine Liste von Artikeln und möchte den Gesamtbetrag der Schecks wissen. Ich könnte etwas tun, wie so:Scala Vals vs Vars
val total = items.filter(_.itemType == CHECK).map(._amount).sum
Das würde mich, was ich brauche, die Summe aller Kontrollen in einer unveränderlichen Variablen. Aber es macht es mit dem, was wie 3 Iterationen scheint. Einmal um die Schecks zu filtern, erneut um die Beträge und dann die Summe abzubilden. Eine andere Möglichkeit wäre, wie etwas zu tun:
var total = new BigDecimal(0)
for (
item <- items
if item.itemType == CHECK
) total += item.amount
Das gibt mir das gleiche Ergebnis, aber mit 1 Iteration und eine veränderbare Variable, die zu fein scheint. Aber wenn ich mehr Informationen extrahieren möchte, sagen wir die Gesamtzahl der Überprüfungen, würde das mehr Zähler oder änderbare Variablen erfordern, aber ich müsste die Liste nicht noch einmal durchlaufen. Scheint nicht wie die "funktionale" Art zu erreichen, was ich brauche.
var numOfChecks = 0
var total = new BigDecimal(0)
items.foreach { item =>
if (item.itemType == CHECK) {
numOfChecks += 1
total += item.amount
}
}
Also, wenn Sie sich um eine Reihe von Zählern oder Summen auf einer Liste zu finden ist es bevorzugt, wandelbar Variablen zu halten oder sich darüber keine Sorgen entlang der Linien von etwas tun:
val checks = items.filter(_.itemType == CHECK)
val total = checks.map(_.amount).sum
return (checks.size, total)
die scheint leichter zu lesen und verwendet nur vals
Der 'for' Ausdruck wird tatsächlich zu einer' map', einem 'filter' und einer' foreach' kompiliert, das entspricht also Ihrem ersten Beispiel. – Theo
Dies ist nicht mehr korrekt: das für Verständnis verwendet mit Filter, nicht Filter, es sei denn, die Sammlung hat keine withFilter-Methode. – extempore