Преобразовать список объектов во вложенную карту в java 8

У меня есть список объектов следующим образом:

Rating {
Long id;
String aRating;
String bRating;
Date date;

//getters and Setters
}

List<Rating> list = //list with some values in it.

Мне нужно преобразовать приведенный выше список во вложенную карту:

Map<Date, Map<CustomEnum, String>> 


Enum CustomEnum {

     aRatingEnum("aRating", "someValue");
     bRatingEnum("bRating", "someValue");

   }

предположим, что список содержит следующие значения:

Id, Date, aRating, bRating
1 , 2/2/2019, A+, B+
2, 2/2/2018, A, B

то это необходимо преобразовать в следующую карту:

Map = {2/2/2019 = {aRatingEnum=A+, bRatingEnum=B+}, 2/2/2018 = {aRatingEnum=A, bRatingEnum=B}}

Я пробовал использовать Java 8:

list.stream().collect(Collectors.groupingBy(x->x.getDate(), Collectors.toMap(
//here I am not able to proceed further how should I approach please help.
)))

Enum предназначен для понимания, код не копируется,

ghufranne 24.06.2019 13:57
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
693
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

toMap собирает несколько предметов в одну коллекцию. У вас есть один объект (Rating), и вы хотите создать из него Map.

Я думаю, что вам нужно collectingAndThen, которое позволяет вам группировать по дате, а затем выполнять перенос на Map в отделке Function.

list.stream()
    .collect(Collectors.collectingAndThen(
                        Collectors.groupingBy(x->x.getDate(), 
                        lr -> {
                            Map<CustomEnum, String> result = new EnumMap<>();
                            Rating r = lr.get(0); // take first rating for that date
                            result.put(CustomEnum.aRatingEnum, r.getARating());
                            result.put(CustomEnum.bRatingEnum, r.getBRating());
                            return result;
                        })));

Или преобразуйте эту лямбду в метод или используйте Map.of, если вы используете Java 9 или выше.

Это даст вам Map<Date, Map<CustomEnum, String>>.

но я хочу только вложенную карту, а не список, разве это невозможно? кроме того, спасибо за ваш ответ.

ghufranne 24.06.2019 13:29

@ghufranne Список создан, потому что у вас может быть более одного Rating на дату. Вам придется решить, как обращаться с несколькими рейтингами.

daniu 24.06.2019 13:30

@ghufranne нет в объекте, но у вас может быть несколько объектов на одну и ту же дату в списке, который вы транслируете. Но я все равно ошибся, я отредактирую, чтобы финишер использовал только первый объект.

daniu 24.06.2019 13:32

лр.получить (0); неверно, lr будет картой списка, результатом группировки по..

ghufranne 24.06.2019 13:49

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