Agrupamento por data:

  • Usamos YearMonth.from(p.getDate()) para agrupar pagamentos por mês/ano, ignorando dias e horários específicos
  • Collectors.groupingBy() é o coletor principal para essa operação

Cálculo do valor total por período:

  • Combinamos groupingBy() com reducing() para somar os valores dos pagamentos
  • Utilizamos o método getTotalAmount() da classe Payment para obter o valor total de cada pagamento

Contagem de pagamentos por período:

  • Usamos Collectors.counting() para contar quantos pagamentos ocorreram em cada mês

Ordenação dos resultados:

  • Os resultados são exibidos em ordem cronológica usando sorted(Comparator.comparing(Map.Entry::getKey))

Visualização dos dados:
Mostramos três relatórios diferentes:

  • Lista detalhada de pagamentos por mês
  • Valor total faturado por mês
  • Quantidade de pagamentos por mês

Esta implementação demonstra como gerar relatórios temporais eficientes usando as APIs de data do Java 8 e streams.

Ver DateReportExample.java