简体   繁体   English

如何使用Java流将子生成的列表组合到一个列表中?

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

相关问题 Java 8:将流列表合并为一个 stream - Java 8: Combine List of streams into one single stream 使用流将列表的收集与单个值组合 - Combine collect of list with single value using streams Java Streams。如何将多个对象的列表加入并合并为一个对象? - Java Streams .How to Join and combine List of several Objects into one Object? 使用Java流将两个大小相同(类型不同)的列表合并到域对象列表中 - Combine two lists of same size (and different type) into list of domain objects using java streams 如何在Java 8中合并不同的流 - How to combine unlike streams in Java 8 如何使用Java 8 Streams分组通过将多个数据库记录映射到具有列表的单个对象 <String> 一栏属性 - How to use Java 8 Streams groupingBy to map multiple database records to a single object with a List<String> property for one column 如何使用 partitioningBy,然后使用 Java Streams 分别对结果列表进行排序 - How to use partitioningBy and then sort resulting lists separately using Java Streams 如何使用 Java Streams 比较两个列表并将共同添加到字段 - How to use Java Streams to compare two lists and add common to a field 如何使用 Java 流将多个列表转换为单个列表? - How to convert multiple list into single list using Java streams? 如何将对象列表组合到单个 object java? - How to combine list of objects to single object java?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM