【问题标题】:Java 8 streams - collect and stream map of listsJava 8 流 - 收集和流式列表的映射
【发布时间】:2017-09-22 01:39:50
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您希望将地图值“展平”在单个列表中。 flatmap() 可能就是您要找的。​​span>

标签: java collections java-stream


【解决方案1】:

要获得与你的迭代代码相同的结果

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

对于流,您首先必须使用flatMapList&lt;PublicationSession&gt; 流转换为PublicationSession 流,然后使用collect(Collectors.toList()) 将所有这些流收集到一个列表中

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 你可以用Collection::stream替换list-&gt;list.stream()
    • @JDC 没错
    猜你喜欢
    • 1970-01-01
    • 2015-12-27
    • 1970-01-01
    • 2015-02-11
    • 1970-01-01
    • 1970-01-01
    • 2015-09-01
    • 1970-01-01
    • 2015-01-29
    相关资源
    最近更新 更多