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
)?
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();
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));
Tu peux essayer
int sum = list.stream().filter(o->o.field>10).mapToInt(o->o.field).sum();
Comme expliqué ici
Essayer:
int sum = lst.stream().filter(o -> o.field > 10).mapToInt(o -> o.field).sum();
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();