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

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

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


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

5

Próbować:

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

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

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();
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.