Java 8 - 如何从列表映射中获取单个值?

Luc*_*uca 3 java lambda java-stream

我有以下地图,Map<List<String>, String>其中包含以下示例值:

List["Los Angeles", "New York", "Chicago"] -> "USA",
List["Toronto", "Vancover", "Montréal"] -> "Canada"
Run Code Online (Sandbox Code Playgroud)

是否可以获取 MapMap<String, String>并将值列表的每个元素映射到它的键?例子:

"Los Angeles" -> "USA",
"New York" -> "USA",
"Chicago" -> "USA",
"Toronto" -> "Canada",
...
Run Code Online (Sandbox Code Playgroud)

我需要它在一个流中,我可以排序后记。

Gáb*_*kos 5

当然有可能:

 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)));
Run Code Online (Sandbox Code Playgroud)

示例输出:

{纽约=美国,蒙特利尔=加拿大,芝加哥=美国,Vancover=加拿大,洛杉矶=美国,多伦多=加拿大}

首先,您必须flatMap在entrySet'sStream上,例如,您可以找到map新Stream条目的键。

正如您提到的,您需要将其作为Stream,所以您可能想在 之前停止collect:

map.entrySet().stream()
  .flatMap(entry -> entry.getKey().stream()
    .map(city -> Map.entry(city, entry.getValue())))
Run Code Online (Sandbox Code Playgroud)

(您可以收集到新的条目Map。)