Присоединение списка <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?
Ответы
Ответ 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("|"))));