2017-10-04 79 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

相關問題