2017-04-25 9 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(); 

だから私は、その後、すべての1つのリストにリストのマップをストリーミングしたいです1つのストリームでそのサブリストを操作するのではなく、2つのステートメントで上記を実行する必要があります(つまり、uリストを反復処理でリストアし、ストリーミングをフィルタリング/ソートして収集します。

これまでのところ、マップをストリーム/収集しようとすると、コンパイルの問題が発生しました。誰もが、ストリーミングを繰り返すことなく、上記の手順を1つのステップで行う方法を示してもらえますか?それはあなたが必要とするすべてのように見える

+0

マップ値を1つのリストで「平坦化」する必要があります。 [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

'list-> list.stream()'を 'Collection :: 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()); 

結果を収集する前に、必要に応じてフィルタリングまたは並べ替えることができます。

関連する問題