当前位置: 首页 > 网络应用技术

JAVA8流源代码物种(3):中间操作原理的详细说明

时间:2023-03-06 17:21:52 网络应用技术

  Java8流源代码发言(1):以一个简单的示例开始

  JAVA8流源代码规范(2):在-Tepth创建原理的深入分析中

  在上一篇文章中,通过分析创建流的过程,splitrator接口定义,拆分器子类的实现,流中的拆分器时间以及流源阶段的流的头结构。带所有人了解流的中间操作是什么,并输入每个中间操作的源代码,以了解我们定义的lambda表达式如何处理流动数据。

  流是惰性流。中间操作仅记录lambda表达式并返回新流。只有在调用操作时,才能触发计算。这可以确保数据尽可能少,这是流效率的原因之一。。如果没有国家操作,则不会存储不存储元素的中间状态。

  我看到有这样的陈述:非状态操作是指以下事实:元素的处理不受先前的元素的影响;国家操作意味着该操作只能在获得所有元素后才能继续。这确实是这样吗?我们将通过稍后分析源代码来找到答案。LET现在查看中间操作的部门:

  无状态操作过滤器()map()maptoint()maptolong()maptodouble()flatMaptoint()flatmaptolong()flatMaptouble())在Java8流源代码改进(1)中:从一个简单的示例开始,在MAP()和Filter()的中间操作中调用后,它返回了Nectlessevlesepop匿名子类的实例。它可以通过继承可以看到结构它继承了引用pipeline像头一样。区别在于它是一个抽象类,因此特定的逻辑仍放在子类中。

  实际上,《无国籍》代表中间操作。它将操作说明的lambda函数保存在某个位置,并在适当的时间打电话。

  您可以看到Necestelessop没有太多内容,但是您可以通过构造函数连接到上一个流的链接列表,然后实现OpisStalful()方法。

  让我们看一下每个中间操作方法中的相似性和差异。

  每个人()熟悉过滤器()方法,返回由匹配谓词函数的元素组成的流。

  如上所述,呼叫过滤器()将返回一个新的无状态台,形成带有上一个流的链接列表,lambda表达式不会立即调用,但在内部存储。接收器。

  每个人都可能在这里头晕,什么是水槽?什么是链球,里面的下游是什么?

  接收器接口是从消费者那里扩展的,该接口用于在流管的各个阶段传输元素,并使用其begin(),end()和cancellationRequsted()方法来管理尺寸信息和控制流。

  链球将接收器接口实现,通过下游变量连接下游的水槽链以形成一个接收器链。BEGIN.BEGIN(),end()和ancellationRequsted()方法,所有方法都直接传递到下游。

  在前两章中,当调用终止操作时,管道的尾巴链接到向前遍历直到标题(不包括)的头节点(不包括)。每次遍历节点时,您都会调用其opwrapsink方法。后一个节点的接收器对象返回一个新的接收器对象。最终,一个带有第一个中间操作的接收器链(终止操作是特殊的接收器)。

  例如,调用stream.map()。筛选 ()。foreach()将在下面形成一个结构:

  让我们看一下过滤器()方法中的水槽:

  MAP()方法通过参数映射器函数的结果返回由原始流中元素的结果组成的流。

  FlatMap()方法返回流。该流中的元素是通过映射器函数在新流中转换为元素合并的原始流中每个元素合并的结果。

  源代码更容易理解。

  PEEK()方法返回新流。该元素是原始流中的元素,但是每个元素都会通过操作额外处理。您应该少使用此方法。它主要用于流调试。不将其理解为foreach()方法。这是一个中间操作。如果未调用终止操作,它将不会触发。

  unroudded()方法返回无序的流。

  调用状态操作,返回statefulop的子类实例。像《无国籍》一样,它从ReferencePipeLine继承。

  唯一的区别是OpisStateful()返回true。

  独特的()方法返回由原始流中不同元素组成的流,即重量元素。

  DISTCT()调用Difcentinctops#Makeref()工厂方法,并输入详细的分析:

  OPWRAPSINK()方法内部非常复杂,主要是基于是否重复和有序的原始流标记,然后返回不同的水槽。我们分开看它。

  该元素是按顺序处理的,因此您可以确定是否通过SeiveNull和LastSeen的两个变量重复该元素。

  对于无序元素,使用主题设置更重。

  排序()方法在对元素进行排序后返回流,有两种重载方法,一种是在自然顺序中排序,另一个是由比较器分类的。

  让我们分析比较器的方法:

  sortedops#makeref():

  返回到ofref对象,从ReferencePipeline.StateFulop继承:

  我们仍然查看其opwrapsink()方法:

  或根据原始流中元素的逻辑,我们单独查看:

  limit()方法返回由原始流中元素组成的新流。流中的元素是第一个元素的原始流中第一个元素的元素,并且不超过MaxSize的某些元素。

  limit()方法已验证了MaxSize参数,然后使用Factory Method sliceops#makeref()创建一个状态表:

  注意Makeref()的参数。

  Skip()方法返回一个新的流,该流在丢弃流中的n个元素后,由其余元素组成。

  可以看出,就像limit()一样,返回也是sliceops#makEref()创建的状态fullop。请注意传递参数和不再解释之间的差异。

  本章首先解释了流的中间操作的概念,然后解释了无状态操作和状态操作如何分配,哪些方法是无状态操作以及哪些是状态操作。通过分析源代码,我们深入了解无状态的OS国家范围 - 未经状态和状态运营的操作,最后分析了每个中间操作方法如何通过继承无状态的或statefulop来具有相应的功能。

  原始:https://juejin.cn/post/7101873469456908296