Как конвертировать список на карту > - PullRequest
1 голос
/ 27 марта 2020

У меня есть какой-то сценарий ios необходимо преобразовать объект из List<Class A> в Map<String, List<Class B>>. Я пытаюсь сгруппировать информацию по одному из полей в классе A и удалить ненужное поле из класса A (результат в классе B)

В настоящее время я могу сделать это с помощью приведенного ниже примера кода.

// Raw data input
List<TestClass> itemList = new ArrayList<>();
    // Add items here...

// group by field
Map<String, List<TestClass>> result = itemList.stream()
             .collect(Collectors.groupingBy(TestClass::getUsername));

// Reform every single list and add to a new Map
Map<String, List<TestClassShort>> tcsMap = new HashMap<>();

for (Map.Entry<String, List<TestClass>> tc: result.entrySet()) {
    tcsMap.put(tc.getKey(), 
               tc.getValue().stream()
               .map(x -> new TestClassShort(x.getGroupId(), x.getGroupName()))
               .collect(Collectors.toList()));
}

Возможно ли достичь цели, не создавая дополнительную промежуточную хэш-карту?

1 Ответ

3 голосов
/ 27 марта 2020

Вы можете предоставить нижестоящий коллектор с groupingBy.

import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.mapping;
import static java.util.stream.Collectors.toList;

// declare for readability, I found it ugly inline
Function<TestClass, TestClassShort> shorten = 
             x -> new TestClassShort(x.getGroupId(), x.getGroupName());

Map<String, List<TestClassShort>> result = itemList.stream()
            .collect(groupingBy(TestClass::getUsername,mapping(shorten, toList())));

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...