我是Java8的新手。我想解决的一个问题是转换Map>使用Stream映射。例如:
input: {A => [B, C, D], E => [F]}
output: {B => A, C => A, D => A, F => E}
假设List中没有重复的值。如何以优雅的方式在java 8流中做到这一点?
干杯, 卫
答案 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)));