为什么要产生一个新对象而不是返回一个Sink字段?这是因为使用opWrapSink()可以将当前操作与下游Sink(上文中的downstream参数)结合成新Sink。试想只要从流水线的最后一个Stage开始,不断调用上一个Stage的opWrapSink()方法直到最开始(不包括stage0,因为stage0代表数据源,不包含操作),就可以得到一个代表了流水线上所有操作的Sink,用代码表示就是这样:　//　AbstractPipeline.wrapSink()　//　从下游向上游不断包装Sink。如果最初传入的sink代表结束操作,　//　函数返回时就可以得到一个代表了流水线上所有操作的Sink。　final　　Sink　　wrapSink　(　Sink　　sink　)　{　...　for　(　AbstractPipeline　p　=　AbstractPipeline　.　this　;　p　.　depth　>　0　;　p　=　p　.　previousStage　)　{　sink　=　p　.　opWrapSink　(　p　.　previousStage　.　combinedFlags　,　sink　);　}　return　(　Sink　)　sink　;　}　现在流水线上从开始到结束的所有的操作都被包装到了一个Sink里,执行这个Sink就相当于执行整个流水线,执行Sink的代码如下:　//　AbstractPipeline.copyInto(),　对spliterator代表的数据执行wrappedSink代表的操作。　final　　void　copyInto　(　Sink　　wrappedSink　,　Spliterator　　spliterator　)　{　...　if　(!　StreamOpFlag　.　SHORT_CIRCUIT　.　isKnown　(　getStreamAndOpFlags　()))　{　wrappedSink　.　begin　(　spliterator　.　getExactSizeIfKnown　());　//　通知开始遍历　spliterator　.　forEachRemaining　(　wrappedSink　);　//　迭代　wrappedSink　.　end　();　//　通知遍历结束　}　...　}　上述代码首先调用wrapp