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

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

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í


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

5

Tratar:

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

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

¿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();
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.