[英]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.