Je n'aime pas utiliser un tableau indexé pour aucune raison autre que je trouve ça moche. Y a-t-il un moyen propre de faire la somme avec une fonction anonyme ? Est-il possible de le faire sans utiliser de variables extérieures ?
Réponses
Trop de publicités?À partir de Dart 2.6, vous pouvez utiliser des extensions pour définir une méthode utilitaire sur la liste. Cela fonctionne pour les nombres (exemple 1) mais aussi pour les objets génériques (exemple 2).
extension ListUtils on List {
num sumBy(num f(T element)) {
num sum = 0;
for(var item in this) {
sum += f(item);
}
return sum;
}
}
Exemple 1 (additionner tous les nombres de la liste):
var numbers = [1, 2, 3];
var sum = numbers.sumBy((number) => number);
Exemple 2 (additionner tous les champs Point.x):
var points = [Point(1, 2), Point(3, 4)];
var sum = points.sumBy((point) => point.x);
Je voudrais simplement ajouter quelques petits détails à la réponse de @tmaihoff (à propos de l'utilisation du package collection.dart):
Le getter sum
dont il parle ne fonctionne que pour des itérables de valeurs num
, comme List
ou Set
.
Si vous avez une liste d'autres types d'objets qui représentent des valeurs (comme Money
, Decimal
, Rational
, ou d'autres) vous devez la mapper en nombres. Par exemple, pour compter le nombre de caractères dans une liste de chaînes de caractères, vous pouvez faire :
// Retourne 15.
['a', 'ab', 'abc', 'abcd', 'abcde'].map((e) => e.length).sum;
En 2022, une autre façon de le faire est d'utiliser la méthode sumBy()
du package fast_immutable_collections:
// Retourne 15.
['a', 'ab', 'abc', 'abcd', 'abcde'].sumBy((e) => e.length), 15);
Remarque : Je suis l'auteur du package.
Je vous suggère de créer cette fonction dans tout fichier utilitaire commun.
T sum(T lhs, T rhs) => lhs + rhs;
int, double, float étendent la classe num, donc vous pouvez utiliser cette fonction pour additionner n'importe quels chiffres.
par exemple,
List a = [1,2,3];
int result = a.reduce(sum);
print(result); // le résultat sera 6