在下面的代码中,我不喜欢我在流之外定义了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 */
})
);
答案 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应该是首选,因为它是一个如此简单的任务。