Преобразовать список в карту в Java 8, добавив значения для ключа, если существует - PullRequest
0 голосов
/ 02 июля 2019

Я пытаюсь преобразовать список в карту. если ключ существует, я просто хочу объединить два значения и разделить их символом "," и назначить его ключу. Если ключ не существует, я просто хочу назначить непосредственно в качестве пары значение ключа, и я хочу использовать потоки для этой цели.

Пример:

List<Object> listObject = {something1,something2,something3}
Map<String,String> listToMap = listObject.stream().collect(Collectors.toMap(listObject::getKey,listObject::getValue))

Выше будет ошибка, если есть дубликаты ключей. Любые предложения полезны здесь.

1 Ответ

1 голос
/ 02 июля 2019

Чтобы toMap обрабатывал дубликаты ключей, необходимо передать функцию слияния, которая принимает два значения и возвращает одно значение.

В вашем случае функция слияния должна объединить два значения:

List<Object> listObject = {something1,something2,something3}
Map<String,String> listToMap =    
    listObject.stream()
              .collect(Collectors.toMap(listObject::getKey,
                                        listObject::getValue,
                                        (v1,v2)->v1+","+v2));

Если вы хотите сохранить значения одного и того же ключа в List, а не объединять их в один String, используйте groupingBy:

List<Object> listObject = {something1,something2,something3}
Map<String,List<String>> listToMap =    
    listObject.stream()
              .collect(Collectors.groupingBy(listObject::getKey,
                                             Collectors.mapping(listObject::getValue,
                                                                Collectors.toList())));
...