Comment faire la somme des champs des éléments de la collection sans les mapper en premier (comme foldLeft / reduceLeft)?
Considérer cette classe:
case class Person(val firstName: String, val lastName: String, age: Int)
val persons = Person("Jane", "Doe", 42) :: Person("John", "Doe", 45) ::
Person("Joe", "Doe", 43) :: Person("Doug", "Don", 65) ::
Person("Darius", "Don", 24) :: Person("Dora", "Don", 20) ::
Person("Dane", "Dons", 29) :: Nil
Pour obtenir la somme de l'âge de toutes les personnes, je peux écrire du code comme:
persons.foldLeft(0)(_ + _.age)
Mais si je veux utiliser sum
j'ai besoin de faire correspondre la valeur de la première et le code ressemble à ceci:
persons.map(_.age).sum
Comment puis-je utiliser le sum
méthode sans la création d'un niveau intermédiaire collection?
(Je sais que cette "optimisation" n'ont pas de réelle différence de performance lorsqu'il n'est pas exécuté dans une boucle serrée, et je connais aussi paresseux points de vue et ainsi de suite.)
Est-il possible d'avoir un code comme
persons.sum(_.age)
faire ce que foldLeft
/reduceLeft
?
source d'informationauteur soc
Vous devez vous connecter pour publier un commentaire.
La méthode
sum
dans la bibliothèque ne fonctionne pas de cette façon, mais vous pouvez écrire votre propre qui ne:Vous pouvez également ajouter une conversion implicite de sorte que vous pouvez l'appeler comme
seq.sum(f)
au lieu demySum(f, seq)
(vous pouvez avoir besoin d'un autre nom quesum
pour éviter les conflits):ou, depuis Scala 2.10,
Vous avez répondu, c'est vous. Utilisez simplement
view
:Pour vous en convaincre en examinant les flux de travail:
Vs: