Java8:如何使用 Stream 将 Map<X, List<Y>> 转换为 Map<Y,X>?

liu*_*923 5 java java-8 java-stream

我是 Java8 的新手。我要解决的一个问题是使用 Stream 将 Map> 转换为 Map。例如:

input: {A => [B, C, D], E => [F]}
output: {B => A, C => A, D => A, F => E}
Run Code Online (Sandbox Code Playgroud)

假设 List 中没有重复值。如何在java 8流中以优雅的方式做到这一点?

干杯,魏

Jim*_*son 3

假设

    Map<String, List<Integer>> map = new HashMap<>();
    Map<Integer,String>        pam = new HashMap<>();
Run Code Online (Sandbox Code Playgroud)

这会做你想做的

    map.entrySet().stream().forEach(e -> e.getValue().stream().forEach(v -> pam.put(v, e.getKey())));
Run Code Online (Sandbox Code Playgroud)

这利用了从Set<E>实现的事实。剩下的就是将东西插入正确的位置。stream()Collection

或者,按照@user140547(谢谢)的建议,一个更简单的解决方案

    map.forEach((k,v) -> v.forEach(vv -> pam.put(vv, k)));
Run Code Online (Sandbox Code Playgroud)