Java 8 将 Map<K, List<V>> 转换为 Map<V, List<K>>

标签 java collections java-8 mapping 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())
)

但我找不到解决初始问题的方法。是否有一些易于准备的 java-8 方法来做到这一点?

最佳答案

我认为您很接近,您需要将这些条目 flatMapStream 并从那里收集。我已经使用了已经存在的 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())
         ));

好吧,如果你不想为那些 SimpleEntry 实例创建额外的开销,你可以做一些不同的事情:

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

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

关于Java 8 将 Map<K, List<V>> 转换为 Map<V, List<K>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51877674/

相关文章:

java - APACHE POI EXCEL XmlException : is an invalid XML character, 有没有办法预处理excel文件?

java - 获取带有空检查的流以及使用 orElse() 和 orElseThrow() 进行集合的功能

java - map 列表 : efficient implementations

kotlin - Kotlin-基于大小和时间的 block 序列

Java Stream_Don't apply filter if my filter string is null

java - 如何在Java Elasticsearch中设置超时

java - volatile 变量的工作

java - 如何使用币安 API,通过代码简单的获取价格

java - Java 中有数组的自动流扩展吗?

Java 8 Stream,如何获得 Top N 计数?