Если вы сопоставляете интересующий вас элемент («G») с 1, а все остальное с 0, среднее значение представляет собой процент «G» в потоке.
double pctG = list.stream()
.mapToInt(obj -> obj.getTag().equals("G") ? 1 : 0)
.summaryStatistics()
.getAverage();
С Java 13, вы можете использовать коллектор teeing()
для подсчета элементов по тегам, и общее количество элементов после фильтрации, заканчивая делением количества групп на общее количество:
Map<String, Double> fractions = weatherData.stream()
.filter(...)
.collect(
Collectors.teeing(
Collectors.groupingBy(Weather::getTag, Collectors.counting()),
Collectors.counting(),
YourClass::scale));
Где функция scale()
делит каждую группу на общую сумму:
static <T> Map<T, Double> scale(Map<? extends T, Long> counts, long total) {
return counts.entrySet().stream().
.collect(Collectors.toMap(e -> e.getKey(), ((double) e.getValue()) / total));
}