如何懒惰地创建流?在迁移基于集合的代码期间,我多次遇到这种模式:
Collection collection = veryExpensiveCollectionCreation();
return Stream.concat(firstStream, collection.stream());
我们知道,生成的连接流通常是懒惰处理的。因此,如果流处理在连接流的第一部分停止,则根本不需要昂贵的集合。
因此,出于性能原因,我想推迟创建整个集合,直到连接流实际上尝试迭代连接的第二部分的元素。
伪代码看起来像
return Stream.concat(firstStream, new LazyStreamProvider() {
Stream<Something> createStream() {
return veryExpensiveCollectionCreation().stream();
}
);
编辑:我知道将集合创建重构为流是最好的,以便能够识别所有API流。但是,在这种情况下,这是另一个具有不可修改API的组件的一部分。
答案 0 :(得分:14)
也许不是最好的解决方案,但您可以使用flatMap
方法构建您的集合,以便它可以懒惰地构建:
return Stream.concat(
firstStream,
Stream.of(Boolean.TRUE).flatMap(ignoredBoolean -> veryExpensiveCollectionCreation().stream())
);