Java8:如何转换Map <x,list <y =“”>&gt;使用Stream映射<y,x>?

时间:2016-09-17 03:32:00

标签: java java-8 java-stream

我是Java8的新手。我想解决的一个问题是转换Map&gt;使用Stream映射。例如:

input: {A => [B, C, D], E => [F]}
output: {B => A, C => A, D => A, F => E}

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

干杯, 卫

4 个答案:

答案 0 :(得分:4)

如果您想要一个没有forEach()的解决方案,您可以这样做:

    Map<Integer, String> pam = 
            map.entrySet().stream()
            .flatMap(x -> x.getValue().stream().map(v -> new AbstractMap.SimpleEntry<>(v, x.getKey())))
            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

对于"3"-> [3,4,5,6]这样的每个条目,创建了3->3,4->3,5->3,6->3条目流,使用flatMap可以将其展平为一个流,然后Collectors.toMap()创建最终Map 1}}。

答案 1 :(得分:3)

使用我写的免费StreamEx库真的很难过:

EntryStream.of(map).invert().flatMapKeys(Collection::stream).toMap();

此处EntryStream.of(map)创建一个地图条目流,通过其他操作进行扩展; invert()交换键和值,flatMapKeys()展平键,使值保持不变,toMap()将结果条目收集回地图。

答案 2 :(得分:2)

假设

    Map<String, List<Integer>> map = new HashMap<>();
    Map<Integer,String>        pam = new HashMap<>();

这将做你想要的事情

    map.entrySet().stream().forEach(e -> e.getValue().stream().forEach(v -> pam.put(v, e.getKey())));

这利用了Set<E>stream()实施Collection这一事实。剩下的就是把东西塞进正确的地方。

或者,正如@ user140547(谢谢)所建议的那样,一个更简单的解决方案

    map.forEach((k,v) -> v.forEach(vv -> pam.put(vv, k)));

答案 3 :(得分:0)

@JimGarrison使用Map.forEach指出它更容易

input.forEach( (key,value)-> value.forEach(vvalue -> output.put(vvalue, key)));