Java - Преобразование списка в карту и внутреннее объединение повторяющихся ключевых данных - PullRequest
3 голосов
/ 07 мая 2020

У меня List данные VO, скажем DataVO например:

DataVO 1: 1, abcd, efgh
DataVO 2: 1, pqrs, wxyz
DataVO 3: 2, hello, letsgo

Я хочу создать Map с ключом в качестве первого элемента и List в качестве значения .

Map<Integer, List<DataVO>> myDataMap

Таким образом, содержимое будет таким:

myDataMap.get(1) - это список, содержащий 1, abcd, efgh & 1, pqrs, wxyz

myDataMap.get(2) - это список, содержащий 2, hello, letsgo

Сейчас делаю вот так:

Map<Integer, List<DataVO>> myDataMap = new HashMap<>();
dataVoList.forEach(dataVo -> {
    int id = dataVo.getId();
    if (myDataMap.containsKey(id)) {
        myDataMap.get(id).add(dataVo);
    } else {
        myDataMap.put(id, new ArrayList<>(Arrays.asList(dataVo)));
    }
});

Как это оптимизировать?

Устал использовать поток, вот так:

dataVoList.stream().collect(toMap(Data::id, ....));

Но это дает ошибку дублирования ключа.

И если я использую атрибут слияния, то сохраняется только один элемент. (Как объяснено здесь )

Пожалуйста, предложите.

1 Ответ

4 голосов
/ 07 мая 2020

Используйте groupingBy:

Map<Integer, List<DataVO>> myDataMap =
    dataVoList.stream()
              .collect(Collectors.groupingBy(DataVO::getId));
...