ストリーム上のドキュメントは言う:
"ストリームを操作する必要があります(中間またはターミナルstrを呼び出すeam operation)を1回だけ実行します。
これはソースコードで実際に見ることができます。あなたは、フィルタを呼び出すとき、それはコンストラクタ(this
)に現在のパイプラインのインスタンスを渡して、新しいステートレス操作を返します。
@Override
public final Stream<P_OUT> filter(Predicate<? super P_OUT> predicate) {
Objects.requireNonNull(predicate);
return new StatelessOp<P_OUT, P_OUT>(this, StreamShape.REFERENCE,
StreamOpFlag.NOT_SIZED) {
....
}
コンストラクタ呼び出しがセットアップされ、このようAbstractPipeline
コンストラクタを呼び出す終わる:
AbstractPipeline(AbstractPipeline<?, E_IN, ?> previousStage, int opFlags) {
if (previousStage.linkedOrConsumed)
throw new IllegalStateException(MSG_STREAM_LINKED);
previousStage.linkedOrConsumed = true;
...
}
フィルタをソース(2行目)で初めて呼び出すと、ブール値がtrueに設定されます。フィルタによって返された戻り値を再利用しないので、フィルタへの2回目の呼び出し(3行目)は、元のストリームソース(1行目)が既にリンクされていること(最初のフィルタ呼び出しのため)取得する。
です。ストリームのトラバースとは異なります。私はストリーム上での操作がそれの内部状態を変更すると仮定します。 –
@ aliasはい、それはストリームの内部状態を変更します。 – mks