web-dev-qa-db-fra.com

Java8: somme des valeurs d'un champ spécifique des objets d'une liste

Supposons avoir une classe Obj

class Obj{

  int field;
}

et que vous avez une liste d'instances Obj, c'est-à-dire List<Obj> lst.

Maintenant, comment trouver dans Java8 avec les flux la somme des valeurs des champs int field à partir des objets de la liste lst sous un critère de filtrage (par exemple, pour un objet o, le critère est o.field > 10)?

45
mat_boy

Tu peux faire

int sum = lst.stream().filter(o -> o.getField() > 10).mapToInt(o -> o.getField()).sum();

ou (en utilisant Method reference)

int sum = lst.stream().filter(o -> o.getField() > 10).mapToInt(Obj::getField).sum();
94
Aniket Thakur

Vous pouvez également collect avec un collecteur de sommation approprié tel que Collectors#summingInt(ToIntFunction)

Retourne une Collector qui produit la somme d'une fonction de valeur entière appliqué aux éléments d'entrée. Si aucun élément n'est présent, le résultat est 0.

Par exemple

Stream<Obj> filtered = list.stream().filter(o -> o.field > 10);
int sum = filtered.collect(Collectors.summingInt(o -> o.field));
4

Tu peux essayer

int sum = list.stream().filter(o->o.field>10).mapToInt(o->o.field).sum();

Comme expliqué ici

4
Paweł Ćwik

Essayer:

int sum = lst.stream().filter(o -> o.field > 10).mapToInt(o -> o.field).sum();
4
JeanValjean

Dans Java 8 pour une entité Obj avec la méthode field et getField (), vous pouvez utiliser:

List<Obj> objs ...

Stream<Obj> notNullObjs =
  objs.stream().filter(obj -> obj.getValue() != null);

Double sum = notNullObjs.mapToDouble(Obj::getField).sum();
0
Zon