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
引用ソースコード行は、2つのストリームではなく** 2つのスプライテータ**で 'estimateSize()言い換えると、*前*で、 'Stream.spliterator()'が呼び出されました。**は**端末操作なので、引用されたドキュメント部分と矛盾していません。ソースストリームが 'ConcatSpliterator'のコンストラクタで破棄されたポイントを超えて怠惰を保存しようとしているのは興味深いですが、これは実装の詳細です。それは影響を正しく伝えていない 'concat'の文書です... – Holger