Tar*_*kyy 6 java mapping collections java-8 java-stream
我需要转换Map<K, List<V>>为Map<V, List<K>>.一段时间以来,我一直在努力解决这个问题.
很明显如何转换Map<K, V>为Map<V, List<K>>:
.collect(Collectors.groupingBy(
Map.Entry::getKey,
Collectors.mapping(Map.Entry::getValue, toList())
)
Run Code Online (Sandbox Code Playgroud)
但我找不到解决最初的问题.是否有一些易于使用的java-8方法可以做到这一点?
Eug*_*ene 11
我认为你很接近,你需要flatMap那些参赛作品Stream并从那里收集.我已经使用了已经存在的SimpleEntry,但你也可以使用Pair某种类型.
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())
));
Run Code Online (Sandbox Code Playgroud)
好吧,如果您不想创建这些SimpleEntry实例的额外开销,您可以做一些不同的事情:
Map<Integer, List<String>> result = new HashMap<>();
initialMap.forEach((key, values) -> {
values.forEach(value -> result.computeIfAbsent(value, x -> new ArrayList<>()).add(key));
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
478 次 |
| 最近记录: |