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)?

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();

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


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));

5

Versuchen:

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

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();

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();
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.