如何使用Java流将子生成的列表组合到一个列表中?

时间:2018-02-13 16:04:59

标签: java lambda java-stream flatmap

在下面的代码中,我不喜欢我在流之外定义了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 */
    })
);

4 个答案:

答案 0 :(得分:2)

您可以在Feed中使用flatMap,并在列表中使用collect所有EmailDrafts,如下所示:

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

答案 1 :(得分:0)

使用map

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

        EmailDraft ed = new EmailDraft();

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

        // ....     

        return ed;
    })
);

答案 2 :(得分:0)

使用范围为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() );

答案 3 :(得分:0)

您可以使用之前的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应该是首选,因为它是一个如此简单的任务。