Группировка по пакетам n часов - PullRequest
0 голосов
/ 08 октября 2018

У меня есть Java POJO с полем LocalDateTime (controlDate) и полем int (orders) и другими, но не относящимися к моей проблеме.

Я получаю список этого POJO из моей базы данныхНапример:

controlDate                 orders
2018-10-07 23:26:00.000+02  5
2018-10-07 23:27:00.000+02  2
2018-10-07 18:33:00.000+02  8
2018-10-07 18:35:00.000+02  4

Моя конечная цель состоит в том, чтобы агрегировать данные по пакетам из n часов (и сохранять самую старую дату в качестве агрегированной даты) и получать среднее значение для столбца «заказы»

например, со значением n = 2, я бы хотел получить что-то вроде:

controlDate                 orders
2018-10-07 23:26:00.000+02  3 (or 4, I don't really care about the rounding)
2018-10-07 18:33:00.000+02  6

Я почти уверен, что используя потоки Java 8, я могу добиться этого, возможно, используяCollectors.grouping, но я не знаю, как именно я могу этого достичь ...

Спасибо за помощь!

1 Ответ

0 голосов
/ 08 октября 2018

Этот код должен помочь:

class Delivery {
    LocalDateTime timestamp;
    Integer packages;

    public Delivery(LocalDateTime timestamp, Integer packages) {
        this.timestamp = timestamp;
        this.packages = packages;
    }


    public Integer getPackages() {
        return packages;
    }

    public LocalDate getDate() {
        return timestamp.toLocalDate();
    }

    public Integer getHour() {
        return timestamp.getHour();
    }

}

public class Calculate {

    public static void main(final String[] args) {
        Stream<Delivery> deliveries = Stream.of(
                new Delivery(LocalDateTime.of(2018, 10, 7, 23, 26), 5),
                new Delivery(LocalDateTime.of(2018, 10, 7, 23, 27), 2),
                new Delivery(LocalDateTime.of(2018, 10, 7, 18, 33), 8),
                new Delivery(LocalDateTime.of(2018, 10, 7, 18, 35), 4)
        );

        deliveries.map(delivery -> {
            Map r = new HashMap();
            r.put(delivery.getHour(), delivery.getPackages());
            return r;
        }).collect(Collectors.groupingBy(d -> d.keySet().toArray()[0])).forEach((o, packages) -> {
            System.out.print(o + ":");
            Integer sum = (Integer) packages.stream().map(map -> map.get(o)).reduce(0, (a, b) -> (Integer) a + (Integer) b);
            long count = packages.stream().count();
            System.out.println(sum / count);
        });
    }
}

И вы получите:

18:6
23:3

Он отсортирован по часам, поэтому вы можете расширить это решение в соответствии со своими потребностями.

...