Как использовать потоки 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);
}
}
какой ИМО следует отдать предпочтение, потому что это такая простая задача.