Summarizing
The summarizing collector performs a functional reduction to produce summary statistics (count, sum, min, max, average) on the numeric results of applying a numeric-valued function to the input elements.
static <T> Collector<T,?,
NumType
SummaryStatistics> summarizing
NumType
(
To
NumType
Function<? super T> mapper)
Returns a collector that applies a numtype-valued mapper function to the input elements, and returns the summary statistics for the resulting values.
NumType is Int (but it is Integer when used as a type name), Long, or Double, and the corresponding numtype is int, long, or double.
The collector Collectors.summarizingInt() is used at (1) as a standalone collector to summarize the statistics for the number of tracks on the CDs. The mapper function CD::noOfTracks passed as an argument extracts the number of tracks from each CD on which the functional reduction is performed.
IntSummaryStatistics stats1 = CD.cdList.stream()
.collect(
Collectors.summarizingInt(CD::noOfTracks) // (1) Standalone collector
);
System.out.println(stats1);
// IntSummaryStatistics{count=5, sum=42, min=6, average=8.400000, max=10}
The IntSummaryStatistics class provides get methods to access the individual results (p. 974).
In the pipeline below, the CDs are grouped by musical genre, and the downstream collector created by the Collectors.summarizingInt() method at (2) summarizes the statistics for the number of tracks on the CDs in each group.
Map<Genre, IntSummaryStatistics> grpByGenre = CD.cdList.stream()
.collect(Collectors.groupingBy(
CD::genre,
Collectors.summarizingInt(CD::noOfTracks))); // (2) Downstream collector
System.out.println(grpByGenre);
//{POP=IntSummaryStatistics{count=2, sum=18, min=8, average=9.000000, max=10},
// JAZZ=IntSummaryStatistics{count=3, sum=24, min=6, average=8.000000, max=10}}
System.out.println(grpByGenre.get(Genre.JAZZ)); // Summary stats for Jazz CDs.
// IntSummaryStatistics{count=3, sum=24, min=6, average=8.000000, max=10}
The collector returned by the Collectors.summarizingInt() method performs effectively the same functional reduction as the IntStream.summaryStatistics() terminal operation (p. 974) at (3).
IntSummaryStatistics stats2 = CD.cdList.stream()
.mapToInt(CD::noOfTracks)
.summaryStatistics(); // (3)
System.out.println(stats2);
// IntSummaryStatistics{count=5, sum=42, min=6, average=8.400000, max=10}