1
當Stream.concat被註釋掉時,createLazyStream按預期工作,僅在應用終端操作時才初始化。Stream.concat錯誤的解決方法
但是,如果你取消註釋Stream.concat線,然後你會看到兩個流進行初始化,即使沒有(沒有應用終端業務)實際使用
這是java的錯誤,對吧? 什麼是解決方法?
@Test
public void testConcat() {
Stream<Integer> stream = createLazyStream();
// Stream<Integer> result = Stream.concat(stream, createLazyStream());
}
private Stream<Integer> createLazyStream() {
return StreamSupport.stream(() -> {
System.out.println("initializing stream");
return IntStream.range(1,10).spliterator();
}, Spliterator.ORDERED, false);
}
_並且僅在流管線的終端操作開始之後_該語句無效。我創建了具有預定義無限估計的延遲分割器,現在它按預期工作,實際流僅在應用終端操作時創建。 – Arthur
引用的源代碼行在兩個**分割器**上調用「estimateSize()」,而不是兩個流。換句話說,在*之前,'Stream.spliterator()'已經被調用,其中**是一個終端操作,所以它與引用的文檔部分並不矛盾。有趣的是,源流嘗試保留超出了ConcatSpliterator構造函數中銷燬的點的懶惰,但這些是實現細節。這是'concat'的文檔,它不能正確說明影響...... – Holger