我试图对 Java 流 API 中惰性求值的应用形成一个简洁而连贯的理解。
目前我的理解是这样的:
- 元素仅在需要时才被消耗,即流是惰性的,并且中间操作是惰性的,例如过滤器,仅在需要时进行过滤。
- 中间操作可以融合在一起(如果它们是无状态的)。
- 短路操作不需要处理整个流。
我想做的就是将所有这些想法结合在一起,并确保我没有歪曲任何内容。我发现这很棘手,因为每当我阅读有关 Java 流的任何文献时,它都会继续说它们是惰性的或利用惰性求值,然后非常可互换地开始谈论诸如融合和短路之类的优化。
那么我说以下的话是否正确?
如果对此有任何进一步的见解和清晰度,我将不胜感激。
至于融合。让我们想象一下这是一个map
手术:
.map(x -> x.squash())
它是无状态的,它只是根据指定的算法转换任何输入(在我们的例子中压缩它们)。现在过滤操作:
.filter(x -> x.getColor() != YELLOW)
它也是无状态的,它只是删除了一些元素(在我们的例子中是黄色的元素)。现在让我们进行终端操作:
.forEach(System.out::println)
它只是将输入元素显示到终端。融合意味着所有中间无状态操作都与终端消费者合并为单个操作:
.map(x -> x.squash())
.filter(x -> x.getColor() != YELLOW)
.forEach(System.out::println)
整个管道融合成单个Consumer
它直接连接到源。当处理每个元素时,源分割器仅执行组合的消费者,流管道不会拦截任何内容,也不会执行任何额外的簿记。这就是融合。熔合不依赖于短路。可以在没有融合的情况下实现流(执行一个操作,获取结果,执行下一个操作,在每个操作后将控制权返回给流引擎)。也可以在不发生短路的情况下进行熔合。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)