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