Подтвердить что ты не робот

Присоединение списка <String> внутри карты

Я пытаюсь преобразовать Map<String, List<String>> в Map<String, String>, где значение для каждой клавиши - это совместная строка, построенная путем объединения всех значений в List на предыдущей карте, например:

A -> ["foo", "bar", "baz"]
B -> ["one", "two", "three"]

следует преобразовать в

A -> "foo|bar|baz"
B -> "one|two|three"

Какой идиоматический способ сделать это с помощью Java 8 Streams API?

4b9b3361

Ответ 1

Вы можете использовать Collectors.joining(delimiter) для этой задачи.

Map<String, String> result = map.entrySet()
                                .stream()
                                .collect(toMap(
                                    Map.Entry::getKey, 
                                    e -> e.getValue().stream().collect(joining("|")))
                                );

В этом коде каждая запись на карте собирается на новую карту, где:

  • ключ остается тем же самым
  • значение, которое является списком, собирается в String путем объединения всех элементов вместе

Ответ 2

Просто используйте String.join, нет необходимости создавать вложенный поток:

Map<String, String> result = map.entrySet()
                            .stream()
                            .collect(toMap(
                                e -> e.getKey(), 
                                e -> String.join("|", e.getValue())));

Ответ 3

Google Guava имеет хороший вспомогательный метод для этого:

com.google.common.collect.Maps.transformValues(map, x -> x.stream().collect(joining("|")));

используя чистую java, это сработает:

map.entrySet().stream().collect(toMap(Entry::getKey, e -> e.getValue().stream().collect(joining("|"))));