Agrupar, Ordenar por Fechas y Totalizar con Java 8
Tenemos una lista de registros de recibosdetalles.
Deseamos agruparlos por idnivel6 y luego por fecha, y encontrar el total por cada fecha del idnivel6.
Similar a la salida que se muestra a continuacion
Primero obtenemos los registros
filtrados por fecha
recibosdetallesList = recibosdetallesFacade.findByEntreFechas(desde, hasta);
/*
0. elimino los recibosdetalles cuyos recibos fueran anualados
*/
recibosdetallesList.stream().filter((r) -> (r.getIdrecibo().getAnulado().equals("si"))).forEach((r) -> {
recibosdetallesList.remove(r);
});
//IMPRIMIR LOS DETALLES
System.out.println("!================= Recibos Detalles =====================!");
recibosdetallesList.forEach(p
-> System.out.println(p.getIdrecibo().getIdrecibo() + " ---> " + p.getIdnivel6().getIdnivel6() + " --> " + p.getFecha()));
/*
1. Agruparlos por nivel6
*/
Map<Nivel6, List<Recibosdetalles>> listRecibosdetallesAgrupado = recibosdetallesList
.stream()
.collect(Collectors.groupingBy(p -> p.getIdnivel6()));
/*
2. Recorrer los agrupados por nivel6
*/
System.out.println("!============== <AGRUPADOS POR NIVEL 6< ==================!");
listRecibosdetallesAgrupado
.forEach((Nivel6 idnivel6, List<Recibosdetalles> p) -> {
/*
2.1 Imprime cada nivel6 agrupado
*/
System.out.println("====================================================");
System.out.println("Nivel6: " + idnivel6.getIdnivel6());
/*
2.3 Agrupo por fecha
*/
Map<Date, List<Recibosdetalles>> listFecha = p
.stream()
.collect(Collectors.groupingBy(p2 -> p2.getFecha()));
/*
2.3 Recorro la agrupacion por fecha
*/
listFecha
.forEach((Date fecha, List<Recibosdetalles> p3) -> {
System.out.println("Fecha: " + fecha);
/*
2.4 Recorro la lista ordenada y sumo los montos de las fechas
*/
System.out.println(" ---------total: " + totalizarFecha(p3));
});
});
Comments