Java 8 流 - 如何将 map 中的所有对象提取到新 map 中?

标签 java java-8 java-stream

我有 map 的 map

siteId -> (AppName -> App) 

我想遍历inner map中的所有Apps,创建一个新的map of

(appId -> App)

我没有流

Map<String, App> result = new HashMap<>();

siteIdToAppNameToAppMap.forEach((siteId, map) ->
   map.forEach((appName, app) ->
      result.put(app.token, app)
   )
);

如何使用流来实现?

最佳答案

像这样的东西怎么样?

siteIdToAppNameToAppMap.values()
   .stream()
   .flatMap(m -> m.values().stream())
   .collect(
        Collectors.toMap(App::getToken, Function.identity())
   );

我们需要使用 Stream#flatMap提取 App从嵌套 map 。所以stream().values()会给我们Stream<Map<AppName,App>>现在我们需要将其转换为 Stream<App>使用平面 map :

Stream<Map<AppName,App>> -> flatMap ->  Stream<App>

之后我们终于可以收集到一个新的 Map<AppId,App>

关于Java 8 流 - 如何将 map 中的所有对象提取到新 map 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49353493/

相关文章:

java - 如何替换 JTextField 中预先输入的字符(一次一个)?

JavaFX:如何在TableView中选择和删除多个对象

java - 在 Mac 上从 Java 1.6 切换到 1.8

java - 通过流 Java 8 迭代从列表中删除元素

java - Jenkins html 发布者插件显示旧的缓存 html——不是更新的

Java - 查找最小数

java - 为什么检索系统信息返回异常空点?

java - int[0] 和 AtomicInteger 哪个更快?

java - 如何在并行流上使用java map-reduce组合器

java - Scala 是否像 Java8 一样具有中间/终端操作?