Giriş
Bir çok stream metodu StatelesOp nesnesi döndürür. Şeklen şöyle
Stream metodlarının gerçekleştirimi ReferencePipeline sınıf içinde. ReferencePipeline da aslında kalıtım sebebiyle bir Stream nesnesi.
Bu sınıfın map metoduna bakalım. Kod şöyle. Yeni bir StatelessOp döndürüyor . StatelessOp sınıfı abstract olduğu için davranışını onWrapSink() ile belirterek yeni bir ReferencePipeline yani Stream oluşturdu
public final <R> Stream<R> map(Function<? super P_OUT, ? extends R> mapper) {Objects.requireNonNull(mapper);return new StatelessOp<P_OUT, R>(this, StreamShape.REFERENCE, <- Pass upstreamStreamOpFlag.NOT_SORTED | StreamOpFlag.NOT_DISTINCT) {@OverrideSink<P_OUT> opWrapSink(int flags, Sink<R> sink) {return new Sink.ChainedReference<P_OUT, R>(sink) {@Overridepublic void accept(P_OUT u) {downstream.accept(mapper.apply(u)); <- Call next stream}};}};}
StatelessOp constructor şöyle. Burada ilk parametrenin isminin upstream olduğu görülebilir.
StatelessOp(AbstractPipeline<?, E_IN, ?> upstream,
StreamShape inputShape,
int opFlags) {
super(upstream, opFlags);
assert upstream.getOutputShape() == inputShape;
}super() ile çağrılam kod şöyle
ReferencePipeline(AbstractPipeline<?, P_IN, ?> upstream, int opFlags) {
super(upstream, opFlags);
}AbstractPipeline(AbstractPipeline<?, E_IN, ?> previousStage, int opFlags) {
if (previousStage.linkedOrConsumed)
throw new IllegalStateException(MSG_STREAM_LINKED);
previousStage.linkedOrConsumed = true;
previousStage.nextStage = this;
this.previousStage = previousStage;
this.sourceOrOpFlags = opFlags & StreamOpFlag.OP_MASK;
this.combinedFlags = StreamOpFlag.combineOpFlags(opFlags, previousStage.combinedFlags);
this.sourceStage = previousStage.sourceStage;
if (opIsStateful())
sourceStage.sourceAnyStateful = true;
this.depth = previousStage.depth + 1;
}Elimizde şöyle bir kod olsun
Stream<Integer> integerStream = Arrays.asList(Integer.valueOf(1), Integer.valueOf(2)) .stream(). map(Scratch::multiply);
Debugger'daki object'ler şöyle
//sourceStage yerine source
//nextStage yerine sink diyelim
//Pipeline nesnesi. sink null, source @839
integerStream = ReferencePipeline$3@836
mapper = Scratch$lambda@838
sourceStage = ReferencePipeline$Head@839
previousStage = ReferencePipeline$Head@839
nextStage = null
sourceSplitIterator = null;
sourceSupplier = null;
//source kendisi sink @836,
sourceStage = ReferencePipeline$Head@839
sourceStage = ReferencePipeline$Head@839
previousStage = null;
nextStage = ReferencePipeline$3@836
sourceSplitIterator = SplitIteratos$ArraySpliterator@840;
sourceSupplier = null
//source @839, sink null
nextStage = ReferencePipeline$3@836
mapper = Scratch$lambda@838
sourceStage = ReferencePipeline$Head@839
previousStage = ReferencePipeline$Head@839
nextStage = null
sourceSplitIterator = null;
Hiç yorum yok:
Yorum Gönder