- Регистрация
- 1 Мар 2015
- Сообщения
- 14,564
- Баллы
- 155
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<Customer, BigDecimal> 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<Customer, Long> countPurchases = payments.stream()
.collect(Collectors.groupingBy(
Payment::getCustomer,
Collectors.counting()
));
Cliente com o produto mais caro:
Map<Customer, Optional<Product>> 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
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<Customer, BigDecimal> 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<Customer, Long> countPurchases = payments.stream()
.collect(Collectors.groupingBy(
Payment::getCustomer,
Collectors.counting()
));
Cliente com o produto mais caro:
Map<Customer, Optional<Product>> 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