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<Product, BigDecimal> 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
 

 
    
Top comments (0)