Как использовать потоки Java для объединения дочерних списков в один список?

В моем коде ниже, мне не нравится, что у меня есть 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 ответа

Ты можешь использовать 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());

Использование map

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

        EmailDraft ed = new EmailDraft();

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

        // ....     

        return ed;
    })
);

Еще один вариант использования диапазона для создания потока 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);
    }
}

какой ИМО следует отдать предпочтение, потому что это такая простая задача.

Другие вопросы по тегам