[英]How to use Java streams to combine child generated lists into a single list?
In my code below, I don't like that I have the List<EmailDraft>
list defined outside of the stream. 在下面的代码中,我不喜欢在流外部定义List<EmailDraft>
列表。 I'm pretty sure there is a way to have the stream processing return a List<EmailDraft>
list directly, I'm just not sure how to do this. 我很确定有一种方法可以让流处理直接返回List<EmailDraft>
列表,但我不确定该怎么做。 Thoughts? 有什么想法吗?
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 */
})
);
You can use flatMap
on the feeds and collect
all the EmailDrafts in a list as following: 您可以在提要上使用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());
Use map
使用map
feeds.stream().flatmap(
sf -> sf.getEntries().stream()).map(se -> {
EmailDraft ed = new EmailDraft();
// Title
ed.setTitle(sf.getTitle());
// ....
return ed;
})
);
Another alternative using range to create stream of title
repeated for the number of elements in sf.getEntries()
: 使用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() );
Instead of overcomplicating things and doing everything with streams, you just could do it the old pre Java-8 way: 不必使事情复杂化并使用流做所有事情,您可以使用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);
}
}
which IMO should be preferred because it is such a simple task. 哪个IMO应该是首选,因为它是如此简单。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.