Java8: suma de valores de un campo específico de los objetos en una lista

81

Suponga que tiene una clase Obj

class Obj{

  int field;
}

y que tiene una lista de Objinstancias, es decir List<Obj> lst.

Ahora, ¿cómo puedo encontrar en Java8 con flujos la suma de los valores de los campos int fieldde los objetos en la lista lstbajo un criterio de filtrado (por ejemplo, para un objeto o, el criterio es o.field > 10)?

mat_boy
fuente

Respuestas:

154

Tu puedes hacer

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

o (usando la referencia de método)

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

Puedes probar

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

Como se explica aquí

Paweł Ćwik
fuente
6

También puede collectcon un colector de suma apropiado comoCollectors#summingInt(ToIntFunction)

Devuelve un Collectorque produce la suma de una función con valores enteros aplicada a los elementos de entrada. Si no hay elementos presentes, el resultado es 0.

Por ejemplo

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

Tratar:

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

En Java 8 para una Objentidad con el fieldmétodo getField (), puede usar:

List<Obj> objs ...

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

Double sum = notNullObjs.mapToDouble(Obj::getField).sum();
Zon
fuente
¿Qué agrega esta respuesta al tema? No se menciona en Indicatorninguna parte de la pregunta y todas las respuestas ya son muy específicas. Entonces, a menos que pueda editar su respuesta para agregar algo realmente útil al tema en cuestión, le sugiero que lo elimine.
Olivier Grégoire
Nombres cambiados para ayudar al pensamiento abstracto de Olivier.
Zona
0

Puede hacer este método: "IntSummaryStatistics"

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