Java 懒散地创建流

Java 懒散地创建流,java,java-stream,Java,Java Stream,如何才能懒洋洋地创建流?在迁移基于集合的代码期间,我多次遇到这种模式: Collection collection = veryExpensiveCollectionCreation(); return Stream.concat(firstStream, collection.stream()); 正如我们所知,生成的级联流通常是延迟处理的。因此,如果流处理在连接流的第一部分停止,则根本不需要昂贵的收集 因此,出于性能原因,我想推迟整个集合的创建,直到连接流实际尝试迭代连接的第二部分的元素

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

Collection collection = veryExpensiveCollectionCreation();
return Stream.concat(firstStream, collection.stream());
正如我们所知,生成的级联流通常是延迟处理的。因此,如果流处理在连接流的第一部分停止,则根本不需要昂贵的收集

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

伪代码看起来像

return Stream.concat(firstStream, new LazyStreamProvider() {
    Stream<Something> createStream() {
         return veryExpensiveCollectionCreation().stream();
    }
);
return Stream.concat(firstStream,新的LazyStreamProvider(){
Stream createStream(){
返回veryExpensiveCollectionCreation().stream();
}
);

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

可能不是最佳解决方案,但您可以使用
flatMap
方法构建集合,这样它将被惰性地构建:

return Stream.concat(
        firstStream, 
        Stream.of(Boolean.TRUE).flatMap(ignoredBoolean -> veryExpensiveCollectionCreation().stream())
);

你能修改
veryExpensiveCollectionCreation()
的主体吗?或者仅仅重载它来返回
流吗?
veryExpensiveCollectionCreation()
能被修改来返回一个惰性流而不是严格的集合吗?我只是把头撞到桌子上,因为这看起来很明显,现在我已经读过了。