2017-10-04 103 views
10

如何才能流畅地创建流?在基于收集代码迁移我遇到了这种模式多次:懒洋洋地创建流

Collection collection = veryExpensiveCollectionCreation(); 
return Stream.concat(firstStream, collection.stream()); 

产生的级联流一般懒洋洋地处理,因为我们知道。因此,如果流处理在串联流的第一部分中停止,则根本不需要昂贵的集合。

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

伪代码看起来像

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

编辑:我知道重构的收集创作到流将是最好的,让所有的API的流察觉。但是,在这种情况下,这是另一个具有不可修改API的组件的一部分。

+1

可以修改veryExpensiveCollectionCreation(的'体)'或者只是超负荷它返回一个'Stream'? – Mena

+2

可以修改'veryExpensiveCollectionCreation()'来返回一个惰性流而不是严格的集合吗? – puhlen

回答

13

也许不是最好的解决办法,但你可以在flatMap方法建立自己的集合,这样它会懒洋洋地建:

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

只是把我的头撞到了桌子上,因为现在我已经读了它,这似乎很明显。 – Bananeweizen