Stream Collectors for Grouping
Demonstrates advanced Stream collectors including groupingBy, partitioningBy, counting, joining, and teeing for complex data aggregation and transformation.
Code
import java.util.*;
import java.util.stream.*;
import java.util.function.*;
public class StreamCollectors {
record Sale(String product, String region, int quantity, double price) {}
public static void main(String[] args) {
List<Sale> sales = List.of(
new Sale("Widget", "North", 10, 9.99),
new Sale("Gadget", "South", 5, 19.99),
new Sale("Widget", "North", 3, 9.99),
new Sale("Gadget", "North", 8, 19.99),
new Sale("Widget", "South", 7, 9.99)
);
Map<String, Long> countByProduct = sales.stream()
.collect(Collectors.groupingBy(Sale::product, Collectors.counting()));
Map<String, Double> revenueByRegion = sales.stream()
.collect(Collectors.groupingBy(
Sale::region,
Collectors.summingDouble(s -> s.quantity() * s.price())
));
Map<Boolean, List<Sale>> partitioned = sales.stream()
.collect(Collectors.partitioningBy(s -> s.quantity() > 5));
String csv = sales.stream()
.map(s -> s.product() + ":" + s.quantity())
.collect(Collectors.joining(", "));
DoubleSummaryStatistics stats = sales.stream()
.mapToDouble(s -> s.quantity() * s.price())
.summaryStatistics();
Map<String, Double> avgRevenueByProduct = sales.stream()
.collect(Collectors.groupingBy(
Sale::product,
Collectors.averagingDouble(s -> s.quantity() * s.price())
));
System.out.println("Count by product: " + countByProduct);
System.out.println("Revenue by region: " + revenueByRegion);
System.out.println("High quantity: " + partitioned.get(true).size());
System.out.println("CSV: " + csv);
System.out.println("Stats: avg=" + stats.getAverage() + ", max=" + stats.getMax());
System.out.println("Avg revenue: " + avgRevenueByProduct);
}
}Report a problem with this exampleOpens a pre-filled issue on GitHub.