Objetivo: calcular o valor total gerado por cada produto vendido (não apenas a quantidade de vendas).
Estratégia
Agrupamento com soma de valores:
Semelhante ao agrupamento por quantidade (Collectors.counting), mas aqui queremos somar valores.
Collectors.summing... só funciona com tipos primitivos (int, double, etc).
Como os valores são BigDecimal, usamos Collectors.reducing explicitamente:
Map
.flatMap(p -> p.getProducts().stream())
.collect(Collectors.groupingBy(
Function.identity(),
Collectors.reducing(BigDecimal.ZERO, Product::getPrice, BigDecimal::add)
));
Exibindo os resultados
Para visualizar melhor, ordenamos pelo valor total crescente:
totalValuePerProduct.entrySet().stream()
.sorted(Comparator.comparing(Map.Entry::getValue))
.forEach(System.out::println);
Exemplo: ValorTotalPorProdutoExemplo.java