Java8: suma wartości z określonego pola obiektów na liście

82

Załóżmy, że mamy klasę Obj

class Obj{

  int field;
}

i że masz listę Objinstancji, tj List<Obj> lst.

Teraz, jak mogę znaleźć w Java8 strumieniach sumę wartości pól int fieldz obiektów na liście lstpod kryterium filtrowania (np. Dla obiektu okryterium to o.field > 10)?

mat_boy
źródło

Odpowiedzi:

157

Możesz to zrobić

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

lub (przy użyciu odniesienia do metody)

int sum = lst.stream().filter(o -> o.getField() > 10).mapToInt(Obj::getField).sum();
Aniket Thakur
źródło
4
Lubint sum = lst.stream().mapToInt(Obj::getField).filter(n -> n > 10).sum();
4castle,
7

Możesz spróbować

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

Jak wyjaśniono tutaj

Paweł Ćwik
źródło
6

Możesz również collectużyć odpowiedniego kolektora sumującego, takiego jakCollectors#summingInt(ToIntFunction)

Zwraca wartość, Collectorktóra generuje sumę funkcji o wartości całkowitej zastosowanej do elementów wejściowych. Jeśli nie ma żadnych elementów, wynikiem jest 0.

Na przykład

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

Próbować:

int sum = lst.stream().filter(o -> o.field > 10).mapToInt(o -> o.field).sum();
Jean Valjean
źródło
0

W Javie 8 dla Objencji z fieldmetodą i getField () można użyć:

List<Obj> objs ...

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

Double sum = notNullObjs.mapToDouble(Obj::getField).sum();
Zon
źródło
Co ta odpowiedź wnosi do tematu? Nigdzie nie ma wzmianki Indicatorw pytaniu, a wszystkie odpowiedzi są już bardzo szczegółowe. Więc jeśli nie możesz edytować swojej odpowiedzi, aby naprawdę dodać coś przydatnego do aktualnego tematu, sugeruję, abyś ją usunął.
Olivier Grégoire
Zmieniono imiona, aby pomóc abstrakcyjnemu myśleniu Oliviera.
Zon
0

Możesz skorzystać z tej metody: „IntSummaryStatistics”

IntSummaryStatistics insum = li.stream().filter(v-> v%2==0).mapToInt(mapper->mapper).summaryStatistics();
Muruganandam C
źródło