Los datos agregados por fecha en la corriente de Java

Vicente Passau

Tengo una lista de StatisticsItem( String context, Integer numberOfHits, String yyyyMM). Un ejemplo de instancia es context=WEBSITE, numberOfHits=12456, yyyyMM="2019-06".

Quiero conseguir un clasificado Map<String, Integer>que tiene como clave la fecha YYYYMM y como valor agregado el número de visitas durante este mes.

Trato de este tipo de código, pero no puedo llenar los espacios en blanco:

Map<String, Integer> collect = 
      list.stream()
          .sorted((s1, s2) -> s1.getYearAndMonth().compareTo(s2.getYearAndMonth()))
          ./* TODO: What method ? */((s1, s2) -> s1.getYearAndMonth().equals(s2.getYearAndMonth())
            ? new StatisticsItem(s1.getNumberOfHits() + s2.getNumberOfHits(), s1.getYearAndMonth()) // Construct new StatistictsItem without "context"
            : /* TODO: don't touch data with different dates */)
    .collect(Collectors.toMap(s -> s.getYearAndMonth(), s -> s.getNumberOfHits()));

entrada:

{context="WEBSITE", numberOfHits=500, yyyyMM="2019-04", 
context="WEBSITE", numberOfHits=750, yyyyMM="2019-05", 
context="WEBSITE", numberOfHits=470, yyyyMM="2019-06",
context="REST", numberOfHits=5400, yyyyMM="2019-04", 
context="REST", numberOfHits=4700, yyyyMM="2019-05", 
context="REST", numberOfHits=9700, yyyyMM="2019-06"}

salida deseada (contexto puede ser nulo o cualquier otra cosa en este caso):

{context=null, numberOfHits=5900, yyyyMM="2019-04", 
context=null, numberOfHits=5450, yyyyMM="2019-05", 
context=null, numberOfHits=10170, yyyyMM="2019-06"}
plato:

Usted puede simplemente grupo por el campo de fecha.

list.stream().groupingBy(StatisticsItem::getYyyyMM, 
              Collectors.mapping(StatisticsItem::getNumberOfHits, Collectors.summingInt(Integer::intValue)))

Entonces usted tiene un Map<String, Integer>con [YYYYMM - count] entradas.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=226897&siteId=1
Recomendado
Clasificación