java - 在 Java 8 中使用流反转 map

标签 java java-8 mapping java-stream reverse

<分区>

我有一个 Map<String, Set<String>>我需要扭转。这将是一个数据示例:

("AA", ("AA01", "AA02", "AA03")
("BB", ("AA01", "BB01", "BB02")

我要获取的是一个Map<String, Set<String>>的反向关系,像这样:

("AA01", ("AA", "BB"))
("AA02",("AA"))
("AA03",("AA"))
("BB01",("BB"))
("BB02",("BB"))

我能够做到,但是使用 foreach:

private Map<String, Set<String>> getInverseRelationship(Map<String, Set<String>> mappings) {
    Map<String, Set<String>> result = new HashMap<>();

    mappings.entrySet().stream().forEach(record -> {
        String key = record.getKey();
        Set<String> itemSet = record.getValue();

        itemSet.forEach(item -> {
            Set<String> values = (result.containsKey(item))? result.remove(item) : new HashSet<>();
            values.add(key);
            result.put(item, values);
        });
    });

    return result;
}

使用 Java 8 流 API 是否有更好的方法?

最佳答案

你可以像这样使用flatMap:

Map<String, Set<String>> invertedMap = map.entrySet().stream()
        .flatMap(entry -> entry.getValue().stream()
                .map(v -> new AbstractMap.SimpleEntry<>(v, entry.getKey())))
        .collect(groupingBy(Map.Entry::getKey, mapping(Map.Entry::getValue, toSet())));

使用 SimpleEntry,您可以将 Set 中的每个元素存储为条目的键,将映射的键存储为条目的值

关于java - 在 Java 8 中使用流反转 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55361148/

相关文章:

scala - 如何将元组映射映射到 Scala 中的映射元组?

java - 嵌入Java应用程序的可移植Web浏览器?

java - 使用 Java 8 Streams 如何将枚举对象数组转换为另一个枚举数组

java - 定义API时应该返回CompletableFuture还是Future?

java8 流不会更改类成员

clojure - 自定义 map 函数在惰性场景中表现奇怪

java - 如何使用 Java 8 Streams groupingBy 将多个数据库记录映射到单个对象,其中一列具有 List<String> 属性

javafx canvas 几秒钟后停止显示(我正在尝试百万个椭圆)

java - 如何从 axis1 stub 获取传输的响应 header

java - 如何在不调用外部 API 的情况下创建微小的 url (Java)