簡體   English   中英

Java 8流-收集和流列表列表

[英]Java 8 streams - collect and stream map of lists

我有一個列表列表,想收集所有值,然后在收集的列表上進行流式傳輸,因此給出:

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

為了獲得相同的迭代代碼結果

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

與流你首先要使用flatMap到transoform您的流List<PublicationSession>在流PublicationSession ,然后收集所有的人都在名單collect(Collectors.toList())

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

在收集結果之前,您可以根據需要進行過濾或排序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM