У меня есть список Entity, который я получил из репозитория.
[DataEntity(key=0a3e1588-ad59-3586-b071-d5001f5ff9a7, timestamp=2024-05-24 09:48:00.0, value=10.0),
DataEntity(key=0a3e1588-ad59-3586-b071-d5001f5ff9a7, timestamp=2024-05-24 09:46:00.0, value=11.0),
DataEntity(key=0a3e1588-ad59-3586-b071-d5001f5ff9a7, timestamp=2024-05-24 09:44:00.0, value=12.0),
DataEntity(key=b349f0ea-c810-3790-bdc3-a82ed5921a28, timestamp=2024-05-24 09:48:00.0, value=13.0),
DataEntity(key=b349f0ea-c810-3790-bdc3-a82ed5921a28, timestamp=2024-05-24 09:46:00.0, value=14.0),
DataEntity(key=b349f0ea-c810-3790-bdc3-a82ed5921a28, timestamp=2024-05-24 09:44:00.0, value=15.0),
DataEntity(key=63d29aeb-ab91-3d24-b40c-d69f2955a893, timestamp=2024-05-24 09:48:00.0, value=16.0),
DataEntity(key=63d29aeb-ab91-3d24-b40c-d69f2955a893, timestamp=2024-05-24 09:46:00.0, value=17.0),
DataEntity(key=63d29aeb-ab91-3d24-b40c-d69f2955a893, timestamp=2024-05-24 09:44:00.0, value=18.0)]
Я не знаю, как реализовать это с помощью потокового API. Я хочу преобразовать этот список в JSON, используя Stream API. Есть ли смысл использовать параллельный поток или в моем случае достаточно обычного потока? Это ожидаемая структура:
{
"0a3e1588-ad59-3586-b071-d5001f5ff9a7": [
{
"timestamp" : "2024-05-24 09:48:00.0",
"value" : 10.0
},
{
"timestamp" : "2024-05-24 09:46:00.0",
"value" : 11.0
}
{
"timestamp" : "2024-05-24 09:44:00.0",
"value" : 12.0
}
],
"b349f0ea-c810-3790-bdc3-a82ed5921a28": [
{
"timestamp" : "2024-05-24 09:48:00.0",
"value" : 13.0
},
{
"timestamp" : "2024-05-24 09:46:00.0",
"value" : 14.0
}
{
"timestamp" : "2024-05-24 09:44:00.0",
"value" : 15.0
}
],
"63d29aeb-ab91-3d24-b40c-d69f2955a893": [
{
"timestamp" : "2024-05-24 09:48:00.0",
"value" : 16.0
},
{
"timestamp" : "2024-05-24 09:46:00.0",
"value" : 17.0
}
{
"timestamp" : "2024-05-24 09:44:00.0",
"value" : 18.0
}
]
}
Это моя реализация в обычном стиле, но выглядит она некрасиво. Как я могу реализовать это с помощью Stream API.
List<DataEntity> dataEntityList = repository.getRecordCountForPeriod();
Map response = new HashMap();
for (DataEntity data : dataEntityList) {
if (response.containsKey(data.getKey())){
List list = (List) response.get(data.getKey());
Map map = new HashMap<>();
map.put("timestamp", data.getTimestamp());
map.put("value", data.getInstancesValue());
list.add(map);
}else{
List list = new ArrayList();
Map map = new HashMap<>();
map.put("timestamp", data.getTimestamp());
map.put("value", data.getInstancesValue());
list.add(map);
response.put(data.getKey(), list);
}
}
@Chaosfire Ты не понимаешь моего вопроса. Я обновил свой пост
Вы используете старомодный класс java.sql.Timestamp? И даже с целью, не связанной с SQL? Конечно, не делайте этого. Для отметки времени используйте Instant или другой подходящий класс из java.time, современного API даты и времени Java. Класс Timestamp был хаком поверх и без того плохо спроектированного класса Date. Оба устарели уже 10 лет.
@Romillion Тогда отредактируйте свой вопрос соответствующим образом, пожалуйста. Название не имеет никакого отношения к реальной проблеме, которую вы хотите решить, и вводит в заблуждение. То же самое относится и к первой половине вопроса.




Поток, который вернет Map<String, List>, сделает свое дело. Вам просто нужно сопоставить значения с ответом, который вы используете. Если вы хотите использовать потоки, я предлагаю вам функцию плоской карты для каждого объекта, а затем собрать их для использования.
Вот рабочее решение вашей проблемы: создан класс DataRecord, который содержит метку времени и значение в качестве поля:
List<DataEntity> list = List.of(
new DataEntity("0a3e1588-ad59-3586-b071-d5001f5ff9a7", "2024-05-24 09:48:00.0", 10.0),
new DataEntity("0a3e1588-ad59-3586-b071-d5001f5ff9a7", "2024-05-24 09:46:00.0", 11.0),
new DataEntity("0a3e1588-ad59-3586-b071-d5001f5ff9a7", "2024-05-24 09:44:00.0", 12.0),
new DataEntity("b349f0ea-c810-3790-bdc3-a82ed5921a28", "2024-05-24 09:48:00.0", 13.0),
new DataEntity("b349f0ea-c810-3790-bdc3-a82ed5921a28", "2024-05-24 09:46:00.0", 14.0),
new DataEntity("b349f0ea-c810-3790-bdc3-a82ed5921a28", "2024-05-24 09:44:00.0", 15.0),
new DataEntity("63d29aeb-ab91-3d24-b40c-d69f2955a893", "2024-05-24 09:48:00.0", 16.0),
new DataEntity("63d29aeb-ab91-3d24-b40c-d69f2955a893", "2024-05-24 09:46:00.0", 17.0),
new DataEntity("63d29aeb-ab91-3d24-b40c-d69f2955a893", "2024-05-24 09:44:00.0", 18.0));
Map<String, List<DataRecord>> map = Optional.ofNullable(list).orElse(Collections.emptyList()).stream()
.collect(Collectors.groupingBy(DataEntity::getKey,
Collectors.mapping(
dataEntity -> new DataRecord(dataEntity.getTimestamp(), dataEntity.getValue()),
Collectors.toList())));
System.out.println(map);
//output
// {0a3e1588-ad59-3586-b071-d5001f5ff9a7=[DataRecord [timestamp=2024-05-24 09:48:00.0, value=10.0],
// DataRecord [timestamp=2024-05-24 09:46:00.0, value=11.0],
// DataRecord [timestamp=2024-05-24 09:44:00.0, value=12.0]],
// 63d29aeb-ab91-3d24-b40c-d69f2955a893=[DataRecord [timestamp=2024-05-24 09:48:00.0, value=16.0],
// DataRecord [timestamp=2024-05-24 09:46:00.0, value=17.0],
// DataRecord [timestamp=2024-05-24 09:44:00.0, value=18.0]],
// b349f0ea-c810-3790-bdc3-a82ed5921a28=[DataRecord [timestamp=2024-05-24 09:48:00.0, value=13.0],
// DataRecord [timestamp=2024-05-24 09:46:00.0, value=14.0],
// DataRecord [timestamp=2024-05-24 09:44:00.0, value=15.0]]}
public class DataRecord {
private String timestamp;
private double value;
public DataRecord(String timestamp, double value) {
super();
this.timestamp = timestamp;
this.value = value;
}
}
I want to convert this list into JSON using Stream API.— это работа для парсера json, gson, jackson и т. д. Определенно не для API потока.