Stream Collectors for Grouping

Demonstrates advanced Stream collectors including groupingBy, partitioningBy, counting, joining, and teeing for complex data aggregation and transformation.

JavaData Fetching

Code

snippet
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);
    }
}