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.