Как сгруппировать объект по «имени» с помощью Java 8? - PullRequest
1 голос
/ 07 октября 2019

У меня есть DTO с несколькими атрибутами, такими как id, name, desc и т. Д.

У него есть геттеры и сеттеры для всех его атрибутов.

Я получаю Page<MyDto> от службы, которая мне нужна для группировки DTO на основе атрибута name.

Сначала я конвертирую Page<MyDto> в List<MyDto>, используя page.getContent.

Мне нужно преобразовать List в Map<String, Object> (не Map<String,String>) , сгруппировав те же names, используя Java8.

.

Я нашел несколько примеров, но они не решили мою проблему. Если это возможный дубликат, пожалуйста, прокомментируйте со ссылкой на оригинальный вопрос.

.

Как сгруппировать список MyDto в карту?

, где ключами являются имена (String),и значения будут Array<MyDto> для каждого имени.

Например:

.

If `List<MyDto>` is : 
[
{"id":1, "name":"albert", "desc":"science"},
{"id":2, "name":"george", "desc":"econ"},
{"id":3, "name":"christ", "desc":"math"},
{"id":4, "name":"george", "desc":"literature"} // george repeats twice
]

Выход Map должен быть:

{

"george":

[
{"id":2, "name":"george", "desc":"econ"},
{"id":4, "name":"george", "desc":"literature"} 
],


"christ":

[
{"id":3, "name":"christ", "desc":"math"}
],


"albert":

[
{"id":1, "name":"albert", "desc":"science"}
]

}

Любая помощь приветствуется, спасибо заранее,

1 Ответ

4 голосов
/ 07 октября 2019

Просто используйте Collectors::groupingBy и передайте ссылку на метод MyDto::getName, который будет использоваться в качестве ключа для вашей карты:

List<MyDto> dtos = ...
Map<String, List<MyDto>> map = dtos.stream()
            .collect(Collectors.groupingBy(MyDto::getName));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...