[英]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.