Java 8流 - 收集和流式传输列表

sub*_*123 2 java collections java-stream

我有一个列表地图,并希望收集所有的值,然后在收集的列表上流,所以给出: -

Map<LocalDateTime, List<PublicationSession>> effectiveDatePublicationMap;
Run Code Online (Sandbox Code Playgroud)

下面的工作/显示我想用迭代做什么,但我想在流中完成所有操作,而不是使用迭代创建一个中间列表: -

List< PublicationSession> publicationsToFilter = new ArrayList<>();
for (List< PublicationSession> sessions : effectiveDatePublicationMap.values()) {
    publicationsToFilter.addAll(sessions);
}

Collection< PublicationSession > wantedPublications = publicationsToFilter.stream()
            .filter(pub -> PublicationStatus.valueOf(pub.getPublishStatus()) == PublicationStatus.COMPLETE)
            .sorted(Comparator.comparing(PublicationSession::getCreateTime))
            .collect(toMap(p -> p.getPublicationSession().getEffDateTime(), UnaryOperator.identity(), PICK_LATEST))
            .values();
Run Code Online (Sandbox Code Playgroud)

因此,我想将列表的映射全部流式传输到一个列表中,然后在一个流中处理该子列表,而不是必须在两个语句中执行上述操作(即通过迭代构建列表,然后执行流式处理以过滤/排序和搜集.

到目前为止我没有这样做,当我尝试流式/收集地图时,我得到编译问题.任何人都可以一步显示如何执行上述操作,而无需进行迭代然后流式传输?

Era*_*ran 6

看起来你需要的只是flatMap原始Map的值,然后像你现在一样继续处理:

Collection< PublicationSession > wantedPublications = 
    effectiveDatePublicationMap.values() // Collection<List<PublicationSession>>
                               .stream() // Stream<List<PublicationSession>>
                               .flatMap(list->list.stream()) // Stream<PublicationSession>
                               .filter(pub -> PublicationStatus.valueOf(pub.getPublishStatus()) == PublicationStatus.COMPLETE)
                               .sorted(Comparator.comparing(PublicationSession::getCreateTime))
                               .collect(toMap(p -> p.getPublicationSession().getEffDateTime(), UnaryOperator.identity(), PICK_LATEST))
                               .values();
Run Code Online (Sandbox Code Playgroud)