Załóżmy, że mamy klasę Obj
class Obj{
int field;
}
i że masz listę Obj
instancji, tj List<Obj> lst
.
Teraz, jak mogę znaleźć w Java8 strumieniach sumę wartości pól int field
z obiektów na liście lst
pod kryterium filtrowania (np. Dla obiektu o
kryterium to o.field > 10
)?
java
filter
java-8
java-stream
mat_boy
źródło
źródło
int sum = lst.stream().mapToInt(Obj::getField).filter(n -> n > 10).sum();
Możesz spróbować
int sum = list.stream().filter(o->o.field>10).mapToInt(o->o.field).sum();
Jak wyjaśniono tutaj
źródło
Możesz również
collect
użyć odpowiedniego kolektora sumującego, takiego jakCollectors#summingInt(ToIntFunction)
Na przykład
Stream<Obj> filtered = list.stream().filter(o -> o.field > 10); int sum = filtered.collect(Collectors.summingInt(o -> o.field));
źródło
Próbować:
int sum = lst.stream().filter(o -> o.field > 10).mapToInt(o -> o.field).sum();
źródło
W Javie 8 dla
Obj
encji zfield
metodą 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();
źródło
Indicator
w 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ął.Możesz skorzystać z tej metody: „IntSummaryStatistics”
IntSummaryStatistics insum = li.stream().filter(v-> v%2==0).mapToInt(mapper->mapper).summaryStatistics();
źródło