Java8: Summenwerte aus einem bestimmten Feld der Objekte in einer Liste

81

Angenommen, Sie haben eine Klasse Obj

class Obj{

  int field;
}

und dass Sie eine Liste von ObjInstanzen haben, dh List<Obj> lst.

Wie kann ich nun in Java8 mit Streams die Summe der Werte der int-Felder fieldaus den Objekten in der Liste lstunter einem Filterkriterium finden (z. B. für ein Objekt oist das Kriterium o.field > 10)?

mat_boy
quelle

Antworten:

153

Du kannst tun

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

oder (unter Verwendung der Methodenreferenz)

int sum = lst.stream().filter(o -> o.getField() > 10).mapToInt(Obj::getField).sum();
Aniket Thakur
quelle
4
Oderint sum = lst.stream().mapToInt(Obj::getField).filter(n -> n > 10).sum();
4castle
7

Du kannst es versuchen

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

Wie hier erklärt

Paweł Ćwik
quelle
6

Sie können auch collectmit einem entsprechenden Summierkollektor wieCollectors#summingInt(ToIntFunction)

Gibt a zurück Collector, das die Summe einer ganzzahligen Funktion erzeugt, die auf die Eingabeelemente angewendet wird. Wenn keine Elemente vorhanden sind, ist das Ergebnis 0.

Zum Beispiel

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

Versuchen:

int sum = lst.stream().filter(o -> o.field > 10).mapToInt(o -> o.field).sum();
Jean Valjean
quelle
0

In Java 8 können Sie für eine ObjEntität mit der fieldMethode getField () Folgendes verwenden:

List<Obj> objs ...

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

Double sum = notNullObjs.mapToDouble(Obj::getField).sum();
Zon
quelle
Was trägt diese Antwort zum Thema bei? Es gibt keine Erwähnung von Indicatorüberall in der Frage und alle Antworten sind schon sehr spezifisch. Wenn Sie Ihre Antwort nicht bearbeiten können, um dem vorliegenden Thema wirklich etwas Nützliches hinzuzufügen, sollten Sie es löschen.
Olivier Grégoire
Die Namen wurden geändert, um Oliviers abstraktem Denken zu helfen.
Zon
0

Sie können diese Methode ausführen: "IntSummaryStatistics"

IntSummaryStatistics insum = li.stream().filter(v-> v%2==0).mapToInt(mapper->mapper).summaryStatistics();
Muruganandam C.
quelle