Stream API конвертирует объект в JSON

У меня есть список 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);
                }
            }
I want to convert this list into JSON using Stream API. — это работа для парсера json, gson, jackson и т. д. Определенно не для API потока.
Chaosfire 24.05.2024 12:22

@Chaosfire Ты не понимаешь моего вопроса. Я обновил свой пост

Romillion 24.05.2024 12:50

Вы используете старомодный класс java.sql.Timestamp? И даже с целью, не связанной с SQL? Конечно, не делайте этого. Для отметки времени используйте Instant или другой подходящий класс из java.time, современного API даты и времени Java. Класс Timestamp был хаком поверх и без того плохо спроектированного класса Date. Оба устарели уже 10 лет.

Anonymous 24.05.2024 14:33

@Romillion Тогда отредактируйте свой вопрос соответствующим образом, пожалуйста. Название не имеет никакого отношения к реальной проблеме, которую вы хотите решить, и вводит в заблуждение. То же самое относится и к первой половине вопроса.

Chaosfire 24.05.2024 20:50
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
86
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Поток, который вернет 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;
        }
    }

Другие вопросы по теме