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

Apr 15, 2025 - 02:39
 0
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