Java 8转换地图<;K、 列表<;V>&燃气轮机;映射<;五、 列表<;K>&燃气轮机;

Java 8转换地图<;K、 列表<;V>&燃气轮机;映射<;五、 列表<;K>&燃气轮机;,java,collections,java-8,mapping,java-stream,Java,Collections,Java 8,Mapping,Java Stream,我需要将Map转换为Map。 我为这个问题挣扎了一段时间 很明显,如何将Map转换为Map: 但我找不到解决最初问题的方法。有什么简单易用的java-8方法吗?我想你很接近了,你需要flatMap将这些条目映射到流中并从那里收集。我使用了已经存在的SimpleEntry,但是您也可以使用某种类型的对 initialMap.entrySet() .stream() .flatMap(entry -> entry.getValue().stream().

我需要将
Map
转换为
Map
。 我为这个问题挣扎了一段时间

很明显,如何将
Map
转换为
Map


但我找不到解决最初问题的方法。有什么简单易用的java-8方法吗?

我想你很接近了,你需要
flatMap
将这些条目映射到
流中并从那里收集。我使用了已经存在的
SimpleEntry
,但是您也可以使用某种类型的

initialMap.entrySet()
          .stream()
          .flatMap(entry -> entry.getValue().stream().map(v -> new SimpleEntry<>(entry.getKey(), v)))
          .collect(Collectors.groupingBy(
               Entry::getValue,
               Collectors.mapping(Entry::getKey, Collectors.toList())
         ));

我只是在写一个答案(先在我的IDE上尝试一下),但并没有通过编译。然后你发布了一个与我的答案一模一样的答案,但你的答案确实通过了编译。我无法发现差异,直到我在一个比较工具中比较了它们,发现我发明了一个新类-
SimplyEntry
+1@Eran老实说,我根本没有编译第一个版本…:)第二种变体我更喜欢,actually@Eugene为了可读性,我将选择第二种解决方案:)很好!这是Lambda动手实验室“挑战”部分的练习之一,我(和一些同事)在过去几年的几次会议上都做过。我们基于流的解决方案基本相同,只是练习使用了
Map
。(还有缩进。):-)
initialMap.entrySet()
          .stream()
          .flatMap(entry -> entry.getValue().stream().map(v -> new SimpleEntry<>(entry.getKey(), v)))
          .collect(Collectors.groupingBy(
               Entry::getValue,
               Collectors.mapping(Entry::getKey, Collectors.toList())
         ));
    Map<Integer, List<String>> result = new HashMap<>();

    initialMap.forEach((key, values) -> {
        values.forEach(value -> result.computeIfAbsent(value, x -> new ArrayList<>()).add(key));
    });