Wednesday, December 17, 2014

Agrupar, Ordenar por Fechas y Totalizar con Java 8

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
ordenar.png


Primero obtenemos los registros
2d.png
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));


                           });


                     

                       });

private Double totalizarFecha(List<Recibosdetalles> p3) { try { Double s = 0.0; s = p3.stream().map((i) -> i.getPago()).reduce(s, (accumulator, _item) -> accumulator + _item); return s; } catch (Exception e) { JSFUtil.addErrorMessage("totalizarFecha() " + e.getLocalizedMessage()); } return 0.0; }

No comments: