11.7 Qual é nosso cliente mais especial?

O "mais especial" pode ser definido por diferentes critérios (ex.: quem gastou mais, quem fez mais compras, etc.). Praticar a flexibilidade do Stream API: O código mostrado no livro foca em calcular o total gasto por cliente (Map), assumindo que o "mais especial" é quem contribuiu mais financeiramente (maior valor acumulado). Agrupa os pagamentos por cliente (groupingBy). Soma os valores de todos os pagamentos de cada cliente (reducing). Map totalValuePerCustomer = payments.stream() .collect(Collectors.groupingBy( Payment::getCustomer, Collectors.reducing(BigDecimal.ZERO, paymentToTotal, BigDecimal::add) )); Ao ordenar o resultado: totalValuePerCustomer.entrySet().stream() .sorted(Comparator.comparing(Map.Entry::getValue)) .forEach(System.out::println); O "cliente mais especial" seria o último da lista (maior valor), no caso do livro: Adriano Almeida=450 Outros Critérios Possíveis Se "mais especial" tivesse outro significado, o código mudaria. Por exemplo: Cliente com mais compras: Map countPurchases = payments.stream() .collect(Collectors.groupingBy( Payment::getCustomer, Collectors.counting() )); Cliente com o produto mais caro: Map mostExpensiveProduct = payments.stream() .collect(Collectors.groupingBy( Payment::getCustomer, Collectors.flatMapping( p -> p.getProducts().stream(), Collectors.maxBy(Comparator.comparing(Product::getPrice)) ) )); Por Que o Livro Escolheu Esse Exemplo? Didático: Mostra como combinar groupingBy com reducing para resolver problemas complexos. Desafio: A versão inicial do código é intencionalmente densa para depois refatorar (com paymentToTotal ou getTotalAmount). Preparação: Ensina a pensar em operações aninhadas (redução dentro de redução), úteis para processamento de dados. Ver: SpecialCustomerExample.java

Apr 19, 2025 - 06:05
 0
11.7 Qual é nosso cliente mais especial?

O "mais especial" pode ser definido por diferentes critérios (ex.: quem gastou mais, quem fez mais compras, etc.).

Praticar a flexibilidade do Stream API: O código mostrado no livro foca em calcular o total gasto por cliente (Map), assumindo que o "mais especial" é quem contribuiu mais financeiramente (maior valor acumulado).

Agrupa os pagamentos por cliente (groupingBy).
Soma os valores de todos os pagamentos de cada cliente (reducing).

Map totalValuePerCustomer = payments.stream()
    .collect(Collectors.groupingBy(
        Payment::getCustomer,
        Collectors.reducing(BigDecimal.ZERO, paymentToTotal, BigDecimal::add)
    ));

Ao ordenar o resultado:

totalValuePerCustomer.entrySet().stream()
    .sorted(Comparator.comparing(Map.Entry::getValue))
    .forEach(System.out::println);

O "cliente mais especial" seria o último da lista (maior valor), no caso do livro:
Adriano Almeida=450

Outros Critérios Possíveis
Se "mais especial" tivesse outro significado, o código mudaria. Por exemplo:

Cliente com mais compras:

Map countPurchases = payments.stream()
    .collect(Collectors.groupingBy(
        Payment::getCustomer,
        Collectors.counting()
    ));

Cliente com o produto mais caro:

Map> mostExpensiveProduct = payments.stream()
    .collect(Collectors.groupingBy(
        Payment::getCustomer,
        Collectors.flatMapping(
            p -> p.getProducts().stream(),
            Collectors.maxBy(Comparator.comparing(Product::getPrice))
        )
    ));

Por Que o Livro Escolheu Esse Exemplo?
Didático: Mostra como combinar groupingBy com reducing para resolver problemas complexos.

Desafio: A versão inicial do código é intencionalmente densa para depois refatorar (com paymentToTotal ou getTotalAmount).

Preparação: Ensina a pensar em operações aninhadas (redução dentro de redução), úteis para processamento de dados.

Ver:
SpecialCustomerExample.java