【问题标题】:Create a stream of the values in maps that are values in another map in Java在映射中创建一个值流,这些值是 Java 中另一个映射中的值
【发布时间】:2016-03-08 23:44:35
【问题描述】:

抱歉问题的标题;我很难理解它。如果你们有更好的标题,请告诉我,我可以更改它。

我有两种类型的对象,书签和修订。我有一张大地图,如下所示:

Map<Long, Bookmark> mapOfBookmarks;

它包含键:值对,如下所示:

1L: Bookmark1,
2L: Bookmark2,
...

每个书签都有一个返回地图的“getRevisions()”方法

public Map<Long, Revision> getRevisions();

我想创建一个 Stream,其中包含 mapOfBookmarks 下存在的所有修订。基本上我想这样做:

List<Revision> revisions = new ArrayList<>();
for (Bookmark bookmark : mapOfBookmarks.values()) { // loop through each bookmark in the map of bookmarks ( Map<Long, Bookmark> )
    for (Revision revision : bookmark.getRevisions().values()) { // loop through each revision in the map of revisions ( Map<Long, Revision> )
        revisions.add(revision);  // add each revision of each map to the revisions list
    }
}
return revisions.stream(); // return a stream of revisions

但是,我想使用 Stream 的功能,所以更像:

return mapOfBookmarks.values().stream().everythingElseThatIsNeeded();

这基本上就像是说:

return Stream.of(revision1, revision2, revision3, revision4, ...);

我该如何写出来?需要注意的是,它所循环的数据集可能很大,这使得 list 方法不太好。

我使用的是 Windows 7 和 Java 8

【问题讨论】:

    标签: java java-8 java-stream


    【解决方案1】:

    flatmap 就是您要找的。当您希望展平的流中包含流时,flatmap 就是答案,

    List<Revision> all =
        mapOfBookmarks.values().stream()
            .flatMap(c -> c.getRevisions().values().stream())
            .collect(Collectors.toList());
    

    【讨论】:

      【解决方案2】:

      您正在寻找flatMap(mapper) 操作:

      返回一个流,其中包含将该流的每个元素替换为通过将提供的映射函数应用于每个元素而生成的映射流的内容的结果。

      在这种情况下,我们通过调用stream() 来创建Stream&lt;Bookmark&gt;,将其平面映射到每个书签的修订版,最后用toList() 将其收集到一个列表中。

      List<Revision> revisions = 
          mapOfBookmarks.values()
                        .stream()
                        .flatMap(bookmark -> boormark.getRevisions().values().stream())
                        .collect(Collectors.toList());
      

      请注意,您当前的代码也可以通过调用 addAll 来改进,而不是遍历每个修订:

      for (Bookmark bookmark : mapOfBookmarks.values()) { // loop through each bookmark in the map of bookmarks ( Map<Long, Bookmark> )
          revisions.addAll(bookmark.getRevisions().values());
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多