SummaryStatistics dla streamów. { weekly #4 }

Dziś krótki wpis między innymi o tym co daje stosowanie mapowanie typu mapToInt (oraz Long, Double) zamiast zwykłego mapowania. Jednym z powodów zastosowania strumienia jest chęć uzyskania prostego wyniku działania dla elementów danej kolekcji. Wyobraźmy sobie, że chcemy uzyskać np. średnią wieku osób, które przechowujemy w zbiorze. Jak podejść do takiego zadania? Używając metody map() możemy jedynie uzyskać wynik count(), min() czy max(). Nie mamy jednak sumy czy średniej.

personList.stream().map(Person::getAge).count()...
personList.stream().map(Person::getAge).min()...

Zróbmy jednak mały reformat kodu i zamiast map() użymy mapToInt().

personList.stream().mapToInt(Person::getAge).average().orElse(0.0);
personList.stream().mapToInt(Person::getAge).sum();
personList.stream().mapToInt(Person::getAge).summaryStatistics().getAverage();
personList.stream().mapToInt(Person::getAge).summaryStatistics().getSum();

Wówczas dostajemy możliwość skorzystania z metod zwracając średnią i sumę. Czy to bezpośrednio z IntStreamu lub za pośrednictwem IntSummaryStatistics. Różnica jest m.in. w zwracanych wynikach. average() zwróci nam Optional, a getAverage()SummaryStatistics double. Dla pustej listy zwróci 0.0. Analogiczne rozwiązania znajdziemy w LongStreamie DoubleStreamie.

SummaryStatistics dla streamów. { weekly #4 }
Przewiń do góry