Что нового
  • Что бы вступить в ряды "Принятый кодер" Вам нужно:
    Написать 10 полезных сообщений или тем и Получить 10 симпатий.
    Для того кто не хочет терять время,может пожертвовать средства для поддержки сервеса, и вступить в ряды VIP на месяц, дополнительная информация в лс.

  • Пользаватели которые будут спамить, уходят в бан без предупреждения. Спам сообщения определяется администрацией и модератором.

  • Гость, Что бы Вы хотели увидеть на нашем Форуме? Изложить свои идеи и пожелания по улучшению форума Вы можете поделиться с нами здесь. ----> Перейдите сюда
  • Все пользователи не прошедшие проверку электронной почты будут заблокированы. Все вопросы с разблокировкой обращайтесь по адресу электронной почте : info@guardianelinks.com . Не пришло сообщение о проверке или о сбросе также сообщите нам.

11.7 Qual é nosso cliente mais especial?

Lomanu4

Команда форума
Администратор
Регистрация
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


Пожалуйста Авторизируйтесь или Зарегистрируйтесь для просмотра скрытого текста.

 
Вверх