java-8 - 使用 Java8 Stream 在 HashMap 中翻转键、值

标签 java-8 java-stream

我在以下结构中有一个 Map,我想翻转键和值。

Map<String, List<String>> dataMap

示例数据:

acct01: [aa, ab, ad],
acct02: [ac, ad]
acct03: [ax, ab]

希望将此数据转换为,

aa: [acct01],
ab: [acct01, acct03],
ac: [acct02],
ad: [acct01, acct02],
ax: [acct03]

想知道有没有java 8-stream的方式来转换Map。

我当前的实现(没有 Stream)

Map<String, List<String>> originalData = new HashMap<String, List<String>>();
        originalData.put("Acct01", Arrays.asList("aa", "ab", "ad"));
        originalData.put("Acct02", Arrays.asList("ac", "ad"));
        originalData.put("Acct03", Arrays.asList("ax", "ab"));

        System.out.println(originalData);
        Map<String, List<String>> newData = new HashMap<String, List<String>>();
        originalData.entrySet().forEach(entry -> {
            entry.getValue().forEach(v -> {
                if(newData.get(v) == null) {
                    List<String> t = new ArrayList<String>();
                    t.add(entry.getKey());
                    newData.put(v, t);
                } else {
                    newData.get(v).add(entry.getKey());
                }
            });
        });
        System.out.println(newData);

输入输出, {Acct01=[aa, ab, ad], Acct02=[ac, ad], Acct03=[ax, ab]} {aa=[Acct01], ab=[Acct01, Acct03], ac=[Acct02], ad=[Acct01, Acct02], ax=[Acct03]}

寻找使用 Stream 实现的方法。

最佳答案

获取条目集的流,将其展平为每个键值对一个条目,按值分组,将关联的键收集到一个列表中。

import static java.util.Arrays.asList;
import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.mapping;
import static java.util.stream.Collectors.toList;

import java.util.AbstractMap.SimpleImmutableEntry;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

<K, V> Map<V, List<K>> invert(Map<K, List<V>> map) {
    return map.entrySet().stream().flatMap(
        entry -> entry.getValue().stream().map(
            value -> new SimpleImmutableEntry<>(
                entry.getKey(),
                value
            )
        )
    ).collect(
        groupingBy(
            Entry::getValue,
            mapping(
                Entry::getKey,
                toList()
            )
        )
    );
}

关于java-8 - 使用 Java8 Stream 在 HashMap 中翻转键、值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45871675/

相关文章:

java - 如何过滤和记录 Java 8 流中的空对象

java - 如何根据给定模式重新排列列表中的项目?

Java 8 Streams - 如何将具有相同字段的列表中的元素合并为一个元素并总结

java - 在 Java 8 中映射后过滤空值

java - 将集合流传输到其他结构

java - 如何在 Java 8 中打印 IntStream 中未过滤的值

java - 在中间操作中使用收集的结果可能存在哪些问题?

java - Spring验证非空元素的字符串列表

java - 如何在Eclipse Mars中导入Gradle/Java8项目(不支持的类版本错误)?

java - (非静态)内部类的构造方法引用?