it-swarm.com.de

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

Angenommen, eine Klasse Obj zu haben

class Obj{

  int field;
}

und dass Sie eine Liste von Obj-Instanzen haben, d. h. List<Obj> lst.

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

45
mat_boy

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();
94
Aniket Thakur

Sie können auch collect mit einem geeigneten Summiersammler wie Collectors#summingInt(ToIntFunction)

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

Zum Beispiel

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

Du kannst es versuchen

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

Wie erklärt hier

4
Paweł Ćwik

Versuchen:

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

In Java 8 für eine Obj-Entität mit der Methode field und getField () können Sie Folgendes verwenden:

List<Obj> objs ...

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

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