11.5 Valores gerados por produto
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 totalValuePerProduct = payments.stream() .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

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