Stream - агрегация постов по годам

Всем доброго времени суток.

Помогите собрать количество постов по дням через Stream? Есть некоторое количество постов, надо получить массив годов, в котором есть хотя бы одна запись, а также количество постов за каждый день (если они там были). Есть List, у каждого поста есть post.getTime() в мс.

Надо что то типа:

{
    "years": [2018, 2019, 2020],
    "posts": {
    "2018-11-12": 6,
    "2019-12-17": 56,
    "2019-12-14": 11,
    "2019-06-17": 1,
    "2020-03-12": 6
    }
}

Лучше года и количества постов за день разделить на 2 структуры, а уж JSON я и сам соберу.

Заранее, большое спасибо.


Ответы (1 шт):

Автор решения: Антоша

Глаза боятся, а руки делают, все получилось, может быть не так элегантно, как хотелось бы, но все работает:

JSONArray yearsArray = new JSONArray();
yearsArray.addAll(getVisiblePost().stream()
    .map(p->1900+p.getTime().getYear()).distinct().collect(Collectors.toList()));

JSONObject postsCounts = new JSONObject();
List<String> dates = getVisiblePost().stream()
    .map(p->new SimpleDateFormat("yyyy-MM-dd").format(p.getTime())).distinct()
    .collect(Collectors.toList());

dates.forEach(d -> {
    postsCounts.put(d, (int) getVisiblePost().stream()
        .filter(p -> new SimpleDateFormat("yyyy-MM-dd").format(p.getTime()).equals(d)).count());
});

response.put("years", yearsArray);
response.put("posts", postsCounts);

getYear() правда deprecated, но нужны в массиве именно инты, а так можно было было через SimpleDateFormat и строки получить...

Как-то так...

→ Ссылка