懒洋洋地创建流

Ban*_*zen 10 java java-stream

如何懒惰地创建流?在迁移基于集合的代码期间,我多次遇到此模式:

Collection collection = veryExpensiveCollectionCreation();
return Stream.concat(firstStream, collection.stream());
Run Code Online (Sandbox Code Playgroud)

正如我们所知,所得到的连接流通常是懒洋洋地处理的.因此,如果流处理在级联流的第一部分中停止,则根本不需要昂贵的集合.

因此,出于性能原因,我想推迟整个集合的创建,直到连接流实际上尝试迭代连接的第二部分的元素.

伪代码看起来像

return Stream.concat(firstStream, new LazyStreamProvider() {
    Stream<Something> createStream() {
         return veryExpensiveCollectionCreation().stream();
    }
);
Run Code Online (Sandbox Code Playgroud)

编辑:我知道将集合创建重构为流是最好的,以使所有API流都能识别.但是,在这种情况下,这是另一个具有不可修改API的组件的一部分.

Oli*_*ssé 14

也许不是最好的解决方案,但您可以在flatMap方法中构建您的集合,以便它将被懒惰地构建:

return Stream.concat(
        firstStream, 
        Stream.of(Boolean.TRUE).flatMap(ignoredBoolean -> veryExpensiveCollectionCreation().stream())
);
Run Code Online (Sandbox Code Playgroud)

  • 只是把我的头撞到桌子上,因为现在看起来很明显,我已经读完了. (3认同)