在地图中创建值的流,这些值是Java

时间:2016-03-08 23:44:36

标签: java java-8 java-stream

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

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

Map<Long, Bookmark> mapOfBookmarks;

它包含key:value对,如下所示:

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

每个书签都有一个&#39; getRevisions()&#39;返回Map的方法

public Map<Long, Revision> getRevisions();

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

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, ...);

我该如何写出来?需要注意的是,它循环的数据集可能很大,使得列表方法的方法很糟糕。

我使用的是Windows 7和Java 8

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

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

  

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

在这种情况下,我们通过调用stream()制作Stream<Bookmark>,将其平面映射到每个书签的修订版,最后将其收集到{{3}的列表中}。

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

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

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