在Java8介绍了流的新功能之后,使用Lambda表达式增强了集合的功能,因此程序员可以快速,方便地操作批处理数据以过滤,转换和组规定,同时可以提高编程效率和可辅助性,据说是真正的开发武器。在本章中,我以一个简单的示例来引导每个人了解流的内部原理。
进入示例之前,让我们看一下流的继承结构。
参考资料线的继承关系显示在图中。流和参考点是为参考类型定义定义的接口和类。还有Flow Intstream,Longstream,DoubleStream,IntPipeeLine和Double Ppippippippippippippippippippippippippippippippippippippippippippippippippippippipleam.本章仅打算解释参考类型流,这是常用的流。将有一个特殊的章节来解释以后基本类型的流动。以下描述了各种类别和界面的责任。
让我们看一下顶接口和类的方法和字段声明。本章仅粗略地解释了Basestream,PipelineHelper和AbstractPipeline。
上面的代码通过()方法的流#s#s创建源流实例,然后依次调用Map(),file()的中间操作方法,最后调用foreach()以终止操作获得最终结果的方法。中间操作不会立即执行声明的逻辑,并且仅在调用终止操作后才触发逻辑。
让我们看一下此示例中如何构建流的方法流#():
流#()是一种工厂方法,将被调用到数组#stream():
然后调用重载方法
构建一个拆分器。目前,我们只需要知道这是像迭代器一样的东西。稍后将详细解释。
为了构建头部实例,头是上面提到的参考点的子类。让我们看一下其结构:
致电父构建器:
构造函数最终称为AbstractPipipeline:
所有说明均在源代码上注释。从上面的源代码中可以得出结论,流的构造返回了ReferencePipeline.head实例。它的结构如下:
接下来,让我们看一下MAP()方法调用逻辑。首先,您将调用ReferencePipeLine#map():
我们发现,在这里创建了无状态运行的子类实例。无状态的是上面提到的参考知文的内部类和子类。这是无状态的中间操作。结构方法如下:
仍调用参考资料线构造函数:
最终,呼叫摘要pipipeline的构建方法:
注意建设性参数。这显然不是构建流时称为构造函数。在构建流时返回的前阶段是返回的头对象。
因此传递流(“>)
Filter()方法首先调用Reference Pipeline#Filter()方法:
与ReferencePipeLine#Map()方法一样,它最终将返回一个无状态的子类。结构变化如下:
示例中的最后一个呼叫是流#foreach()方法。foreach()是终止操作,它将触发上述语句的逻辑。在这里,您将调用ReferencePipeLine#foreach()方法:
foreachOps#makeref()是一种返回终端实例的工厂方法。它代表终止操作。这是foreachop.ofref:
让我们看一下Ofref:
OFREF从Foreachop继承,然后让我们看一下其定义:
foreachOp实现终端和终端链接接口。
FOREACHOP实现的另一个接口是terminalSink。它的接口语句如下:
可以看出,它聚集了水槽和供应商接口。供应商是功能接口。只有一个get()方法。让我们看一下水槽的定义:
槽继承消费者界面,并具有Accept()方法。LET来看一下要做什么:
在这一点上,接收器链接列表已完成,最后返回:
可以看出,for循环中的条件为p.depth> 0,head#opwrapsink()将抛出无抑制的exception exception异常,因此不会调用head opwrapsink()方法。
通过wrapsink()方法构造接收器链接列表后,您将调用AbstractPipeline#copyInto()方法以执行真实的数据处理逻辑:
因为流#foreach()是非short -circuit操作,因此输入逻辑。您还可以通过调试来查看:同时,您可以看到提交的水槽是上面的接收器链接列表:
这里的逻辑分为三个步骤。我们将单独解释:
在这里,通过流分析处理数据的过程和源代码。
本文首先介绍了流的继承结构,并分析了顶层的界面和抽象类中的方法和字段,因此每个人都对流的家族都有一般的了解。然后使用一个简单的示例来解释蒸汽的方式详细构建,如何在中间操作后形成管道链接列表,以及如何终止声明的函数如何内置到接下来的链接列表中。
Java8中的流源代码有很多可以解释的地方,例如,创建流的方法是什么,中间操作是什么,并且有几种类型的终止操作。并以列的形式解释与流有关流有关的源代码。
最后,这并不容易。如果您认为这一系列文章对您有帮助,可以加深对流原理和源代码的理解,请随时毫不犹豫地(?Ω?)来赞美!
原始:https://juejin.cn/post/7100824118831874078