Downstream numeric collectors turn a grouping into an aggregate report without a second pass over the data.
record Reading(String sensor, double value) {}
var readings = List.of(new Reading("t1", 20.5), new Reading("t1", 21.5),
new Reading("t2", 30.0), new Reading("t2", 32.0));
Map<String, Double> avg = readings.stream().collect(
Collectors.groupingBy(Reading::sensor, TreeMap::new,
Collectors.averagingDouble(Reading::value)));
avg.forEach((sensor, mean) -> System.out.println(sensor + " average = " + mean));
t1 average = 21.0
t2 average = 31.0
Run this yourself in the Online Java Compiler, spin up a live REST API in the API Sandbox, or practise with Java interview questions.
Published 2026-07-30