// Created on savesnippets.com · https://savesnippets.com/FO4Ktwr5LsBxXJ import java.util.*; import java.util.stream.*; import static java.util.stream.Collectors.*; class Demo { record Sale(String region, String product, double amount) {} void example() { var sales = List.of( new Sale("US", "Widget", 100), new Sale("US", "Gizmo", 150), new Sale("EU", "Widget", 200), new Sale("EU", "Widget", 80), new Sale("US", "Widget", 90) ); // Group by region → Map> Map> byRegion = sales.stream() .collect(groupingBy(Sale::region)); // Group by region, downstream → sum the amounts Map revenueByRegion = sales.stream() .collect(groupingBy(Sale::region, summingDouble(Sale::amount))); System.out.println(revenueByRegion); // {US=340.0, EU=280.0} // Two-level grouping: region → product → count Map> matrix = sales.stream() .collect(groupingBy(Sale::region, groupingBy(Sale::product, counting()))); System.out.println(matrix); } }