java - getValue 返回列表的反向映射

标签 java java-8 hashmap inverse

我想转换一个 Map<String, List<Object>>所以它变成了Map<String, String> .如果它只是 Map<String, Object>在 Java8 中很容易;

stream().collect(k -> k.getValue().getMyKey(), Entry::getKey);

但这行不通,因为 getValue 返回一个列表 Map<List<Object>, String>在我的例子中。假设 Object 包含一个用于键的 getter 并且 Object不包含第一个映射中的键。

有什么想法吗?

最佳答案

流过对象列表并提取您需要的 key ,然后 map --> flatten --> toMap

source.entrySet()
      .stream()
      .flatMap(e -> e.getValue()
                     .stream()
                     .map(x -> new SimpleEntry<>(x.getMyKey(), e.getKey())))
      .collect(toMap(SimpleEntry::getKey, SimpleEntry::getValue));

如果预期存在重复,请使用合并功能 getMyKey()值(value)观:

source.entrySet()
      .stream()
      .flatMap(e -> e.getValue()
                     .stream()
                     .map(x -> new SimpleEntry<>(x.getMyKey(), e.getKey())))
      .collect(toMap(SimpleEntry::getKey, SimpleEntry::getValue, (l, r) -> l));

注意:上面使用源映射键作为结果映射的值,因为这似乎是您在帖子中说明的内容,但是如果您希望保留源映射的键作为结果映射的键,然后更改 new SimpleEntry<>(x.getMyKey(), e.getKey())new SimpleEntry<>(e.getKey(),x.getMyKey()) .

关于java - getValue 返回列表的反向映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53498793/

相关文章:

java - TableColumn #setCellValueFactory 对于具有 HashMap 的类

java - 如何有效地在整数范围列表中搜索 - java

java - 如何修复我的 Android 应用程序中的布局 View ?

javax.servlet.ServletException : bean [name] not found within scope

java - Spring boot 没有使用 spring 数据和 hibernate 与 sql server 一起运行

java - 将 Lambda 表达式简化为一行

java - Java 中的 HashMap 不工作

Java 对象数组 Foreach 方法访问

java - 如何在Java中生成列表的所有k-sublists?

java - 使用 Java8 流 API 从集合中删除最大值(或最小值)