2017-04-25 58 views
2

的流映射我有一個映射列出的,並想收集所有的值,然後流收集到的名單,所以給出: -的Java 8流 - 收集並列出

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

,所以我想流列表的地圖全部納入一個名單,然後在一個流中工作在這個子列表上,而不是必須在兩個語句中完成上述操作(即構建你的通過迭代列表,然後進行流式過濾/分類和收集。

我到目前爲止沒有這樣做,當我嘗試和流/收集地圖我得到編譯問題。任何人都可以展示如何一步完成上述操作,而無需迭代,然後流式傳輸?

+0

你想「扁平化」地圖值在一個列表中。 [flatmap()](https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#flatMap-java.util.function.Function-)可能就是你尋找。 –

回答

4

它看起來像所有你需要的是原始地圖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(); 
+1

你可以用'Collection :: stream'替換'list-> list.stream()' – JDC

+0

@JDC這是真的 – Eran

0

要獲得你的重複代碼相同的結果

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

您首先必須使用流flatMap來將您的List<PublicationSession>流合併爲PublicationSession的流,然後將它們全部收集在列表中,其中collect(Collectors.toList())

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

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