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

时间:2017-04-25 07:10:08

标签: java collections java-stream

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

Map<LocalDateTime, List<PublicationSession>> effectiveDatePublicationMap;

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

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();

所以我想将列表的映射全部放到一个列表中,然后在一个流中处理该子列表,而不是必须在两个语句中执行上述操作(即通过迭代构建列表,然后进行流式处理以过滤/ sort and collect。

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

2 个答案:

答案 0 :(得分:6)

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

flatMap

答案 1 :(得分:0)

获得迭代代码的相同结果

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

使用流首先必须使用flatMapList<PublicationSession>的流中转换PublicationSession流,然后在collect(Collectors.toList())的列表中收集所有这些流

List<PublicationSession> publicationsToFilter = effectiveDatePublicationMap.values()
                                                   .flatMap(Collection::stream)
                                                   .collect(Collectors.toList());

在收集结果之前,您可以根据需要进行过滤或排序。