簡體   English   中英

如何使用Java流將子生成的列表組合到一個列表中?

[英]How to use Java streams to combine child generated lists into a single list?

在下面的代碼中,我不喜歡在流外部定義List<EmailDraft>列表。 我很確定有一種方法可以讓流處理直接返回List<EmailDraft>列表,但我不確定該怎么做。 有什么想法嗎?

List<EmailDraft> drafts   /* <-- don't like this */
    = new LinkedList<>();

List<SyndFeed> feeds
    = evnt.getFeeds();

feeds.stream().forEach(
    sf -> sf.getEntries().stream().forEach(se -> {

        EmailDraft ed = new EmailDraft();

        // Title
        ed.setTitle(sf.getTitle());

        // ....     

        // Add to list
        drafts.add(ed);  /* <-- don't like this either */
    })
);

您可以在提要上使用flatMap ,並將所有EmailDrafts collect在列表中,如下所示:

List<EmailDraft> emailDrafts =
            feeds.stream()
                 .flatMap(
                         sf -> sf.getEntries().stream().map(se -> {

                             EmailDraft ed = new EmailDraft();

                             // Title
                             ed.setTitle(sf.getTitle());

                             return ed;
                         })
                 ).collect(Collectors.toList());

使用map

feeds.stream().flatmap(
    sf -> sf.getEntries().stream()).map(se -> {

        EmailDraft ed = new EmailDraft();

        // Title
        ed.setTitle(sf.getTitle());

        // ....     

        return ed;
    })
);

使用range創建另一個title流的另一種方法是針對sf.getEntries()的元素數進行重復:

        List<EmailDraft> drafts = feeds.stream()
        .flatMap( sf -> IntStream.range( 0, sf.getEntries().size() ).mapToObj( i -> sf.getTitle() ) )
        .map( t -> { 
                       EmailDraft ed = new EmailDraft(); 
                       ed.setTitle(t); 
                       return ed;
                    } 
        )
        .collect( Collectors.toList() );

不必使事情復雜化並使用流做所有事情,您可以使用Java-8之前的方法來完成:

List<EmailDraft> drafts = new ArrayList<>();
for(SyndFeed sf : feeds){
    for(int i = sf.getEntries().size(); i > 0; i--){
        EmailDraft ed = new EmailDraft();
        ed.setTitle(sf.getTitle());
        drafts.add(ed);
    }
}

哪個IMO應該是首選,因為它是如此簡單。

暫無
暫無

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

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