Các tài liệu trên Streams nói:
"Luồng phải được vận hành trên (gọi một đường trung gian hoặc đầu cuối eam hoạt động) chỉ một lần. "
Bạn thực sự có thể thấy điều này trong mã nguồn. Khi bạn gọi lọc nó trả về một hoạt động không quốc tịch mới, đi qua các ví dụ đường ống hiện nay ở các nhà xây dựng (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) {
....
}
Cuộc gọi constructor kết thúc lên gọi AbstractPipeline
constructor, được thiết lập như thế này:
AbstractPipeline(AbstractPipeline<?, E_IN, ?> previousStage, int opFlags) {
if (previousStage.linkedOrConsumed)
throw new IllegalStateException(MSG_STREAM_LINKED);
previousStage.linkedOrConsumed = true;
...
}
Lần đầu tiên bạn gọi bộ lọc trên nguồn (dòng 2), nó đặt giá trị boolean thành true. Vì bạn không sử dụng lại giá trị trả về được đưa ra bởi bộ lọc, cuộc gọi thứ hai để lọc (dòng 3) sẽ phát hiện nguồn gốc ban đầu (dòng 1) đã được liên kết (do cuộc gọi bộ lọc đầu tiên) và do đó bạn ngoại lệ được.
Nguồn
2016-01-08 13:20:11
Vì vậy, hoạt động trên một Stream là một cái gì đó khác với truyền tải luồng. Tôi cho rằng hoạt động trên một Stream thay đổi trạng thái bên trong của nó. –
@ilias yes, nó thay đổi trạng thái nội bộ của Luồng. – mks