【问题标题】:Java streams: flatMap returns Stream of ObjectsJava 流:flatMap 返回对象流
【发布时间】:2019-07-07 09:52:33
【问题描述】:

我有这个代码:

List<Application> applications = this.applicationDao.findAll();
Collection<Pair<Application, FileObject>> files = applications.stream()
    .flatMap(app -> streamOfFiles.map(file -> Pair.of(app, file)));

其中streamOfFilesStream&lt;FileObject&gt;

目前,我收到以下编译消息:

类型不匹配:无法从 Stream&lt;Object&gt; 转换为 Collection&lt;Pair&lt;Application,FileObject&gt;&gt;

有什么想法吗?

【问题讨论】:

  • flatMap() 不是终端操作。如果你想返回结果,你应该调用任何终端操作。

标签: java java-stream


【解决方案1】:

你似乎错过了那里的collect

Collection<Pair<Application, FileObject>> files = applications.stream()
        .flatMap(app -> files.stream().map(file -> Pair.of(app, file)))
        .collect(Collectors.toList()); // any collection you want

编辑:由于 streamOfFiles 在单个 flatMap 操作中被消耗,您应该更喜欢使用 &lt;collection&gt;.stream() 而不是在那里创建流为每个app重新更新。

【讨论】:

    【解决方案2】:

    您不能在迭代 applications 时重复使用 streamOfFiles Stream!

    您需要将streamOfFilesStream&lt;FileObject&gt; 转换为List&lt;FileObject&gt;,然后:

    List<FileObject> listOfFiles = streamOfFiles.collect(Collectors.toList());
    List<Application> applications = this.applicationDao.findAll();
    Collection<Pair<Application, FileObject>> files =  applications.stream()
                .flatMap(app -> listOfFiles.stream().map(file -> Pair.of(app, file)))
                .collect(Collectors.toList());
    

    一个简单的例子来证明:

    Stream<Integer> s = IntStream.range(0, 100).boxed();
    IntStream.range(0, 100).boxed()
             .flatMap(i -> s.map(j -> i * j))
             .collect(Collectors.toList());
    

    它抛出这个异常:

    java.lang.IllegalStateException: 流已经被操作或关闭

    【讨论】:

    • 你是对的。它为每个Application 调用,这就是它被操作的地方。 因此出现错误。 &lt;collection&gt;.stream 应该是更好的方法。
    猜你喜欢
    • 2020-03-23
    • 2018-06-02
    • 2018-07-14
    • 2022-06-10
    • 2020-07-25
    • 2019-02-10
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    相关资源
    最近更新 更多