如何将Map <v1,Set <v2 >>反转为Java中的Map <v2,Set <v1 >> with stream()

Zof*_*off 2 java java-8 java-stream

我有一个Map对象Map<t1, Set<t2>>,我想进入集合并将t2集合转换为新地图的键.原始键t1将是地图的新值.
例如,给定一个包含两个条目的地图

{key1: [a, b, c], key2: [c, d]}
Run Code Online (Sandbox Code Playgroud)

得到的地图将是

{a: [key1], b: [key1], c: [key1, key2], d: [key2]}
Run Code Online (Sandbox Code Playgroud)

[]表示在上面的例子中设置.

shm*_*sel 9

Java 8:

map.entrySet()
        .stream()
        .flatMap(e -> e.getValue()
                .stream()
                .map(v -> new SimpleEntry<>(v, e.getKey())))
        .collect(Collectors.groupingBy(Entry::getKey,
                Collectors.mapping(Entry::getValue, Collectors.toSet())))
Run Code Online (Sandbox Code Playgroud)

番石榴:

Multimaps.asMap(map.entrySet()
        .stream()
        .collect(ImmutableSetMultimap.flatteningToImmutableSetMultimap(
                Entry::getKey, e -> e.getValue().stream()))
        .inverse())
Run Code Online (Sandbox Code Playgroud)

StreamEx:

EntryStream.of(map)
        .flatMapValues(Set::stream)
        .invert()
        .grouping(Collectors.toSet())
Run Code Online (Sandbox Code Playgroud)