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 и строки получить...
Как-то так...