Java 8 - Как получить отдельные значения из карты списков? - PullRequest
3 голосов
/ 19 февраля 2020

У меня есть следующая Карта Map<List<String>, String> со следующими примерами значений:

List["Los Angeles", "New York", "Chicago"] -> "USA",
List["Toronto", "Vancover", "Montréal"] -> "Canada"

Можно ли получить Карту Map<String, String> и сопоставить каждый элемент списка значений с его ключом? Пример:

"Los Angeles" -> "USA",
"New York" -> "USA",
"Chicago" -> "USA",
"Toronto" -> "Canada",
...

Мне нужно в потоке, чтобы послесловия я мог отсортировать.

1 Ответ

5 голосов
/ 19 февраля 2020

Конечно, это возможно:

 Map<List<String>, String> map = new HashMap<>();
    map.put(List.of("Los Angeles", "New York", "Chicago"), "USA");
    map.put(List.of("Toronto", "Vancover", "Montréal"), "Canada");

    Map<String, String> newMap = map.entrySet().stream().flatMap(entry -> entry.getKey().stream().map(city -> Map.entry(city, entry.getValue()))).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)));

Пример вывода:

{Нью-Йорк = США, Монреаль = Канада, Чикаго = США, Ванковер = Канада , Лос-Анджелес = США, Торонто = Канада}

Сначала вы должны flatMap на entrySet Stream где вы можете map ключи для новых Stream записей, например.

Как вы упомянули, вам нужно это как Stream, поэтому, вероятно, вы захотите остановиться до collect:

map.entrySet().stream()
  .flatMap(entry -> entry.getKey().stream()
    .map(city -> Map.entry(city, entry.getValue())))

(Те записи, которые вы можете собрать для нового Map .)

...