java - 如何将这个包装 map 列表展平为另一种 map Java 8?

标签 java java-8 java-stream collectors

我无法弄清楚如何处理清理我的一些代码来执行此操作:

我有一个列表 Context对象。每个Context有一个 String userId和一个 Map<String, SomeObject> someObjects .

我想将其扁平化为 Map<String, SomeObjects>其中 kep 是 userId .更具体地说:

class Context {
    String userId;
    Map<String, List<SomeObject>> // the String here is something other than userId
    // other stuff, getters/setters
}

给定List<Context> , 我想得到 Map<String, List<SomeObject>但字符串实际上是 userId。

有没有一种干净的方法来做到这一点?

最佳答案

假设 Context有一个 String userid和一个 List<SomeObject> someObjects :

Map<String, Set<SomeObject>> map = contexts.stream()
    .collect(Collectors.toMap(Context::getUserid, 
       c -> c.getSomeObjects().values().stream()
      .flatMap(Collection::stream)
      .collect(Collectors.toSet())
     ));

这里的重点是 toMap() 的使用通过 userid 收集和 flatmap() Stream<List<SomeObject>>进入Stream<SomeObject>这样您就可以将它们收集到一个集合中。

关于java - 如何将这个包装 map 列表展平为另一种 map Java 8?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43195400/

相关文章:

Java 流收集器在 Set::size 上出现 groovy 错误

java-8 - 在 cloud9 上安装 Java 8

Java 8 将 BiFunction 应用于两个不同对象的列表

java - 如何使用流编译具有给定属性最大值的所有对象的列表?

java - 将 `IntStream.generate` 与有状态 `IntSupplier` 一起使用时有哪些陷阱?

java - Maven - 部署 :deploy-file over series of files within ${project. build.directory} (target/)

java - 通过java邮件发送带有包含byte[]附件的电子邮件

java - GAE - 未找到元数据

java - Spring 框架 : instantiation exception

arraylist - 有没有办法使用Java 8中的数据流将由特定字符描绘的许多多行字符串收集到Arraylist中?