首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java流懒惰vs融合与短路

Java流懒惰vs融合与短路
EN

Stack Overflow用户
提问于 2016-02-02 10:00:49
回答 1查看 1.7K关注 0票数 5

我正试图对Java中的惰性评估的应用程序形成一个全面和一致的理解。

以下是我目前的理解:

  • 元素只在需要时使用,即流是惰性的,而中间操作是惰性的,例如过滤器,只有在需要时才会过滤。
  • 中间操作可以融合在一起(如果它们是无状态的)。
  • 短路操作不需要处理整个流.

我想要做的是把所有这些想法结合起来,确保我没有歪曲任何东西。我觉得这很棘手,因为每当我读到关于Java流的任何文献时,它都会继续说它们是懒惰的或使用懒惰的评估,然后非常交替地开始谈论诸如融合和短路之类的优化。

那么,我说的对吗?

  • 融合是在流API中实现懒惰评估的方式--也就是说,在可能的情况下,一个元素被消耗,操作被融合在一起。我在想,如果融合不存在,那么我们肯定会回到急切的评估,因为替代方法就是在进入下一个操作之前处理每个中间操作的所有元素?
  • 不需要融合或延迟评估,短路是可能的,但是在流的上下文中,这两个原则的实现有很大帮助吗?

我希望你能对此有更深入的见解和清晰的见解。

EN

回答 1

Stack Overflow用户

发布于 2016-02-02 15:22:34

至于聚变。让我们想象一下下面是一个map操作:

代码语言:javascript
复制
.map(x -> x.squash())

它是无状态的,它只是根据指定的算法转换任何输入(在本例中是压缩它们)。现在,过滤器操作:

代码语言:javascript
复制
.filter(x -> x.getColor() != YELLOW)

它也是无状态的,它只是删除了一些元素(在我们的例子中是黄色元素)。现在让我们来做一个终端操作:

代码语言:javascript
复制
.forEach(System.out::println)

它只向终端显示输入元素。融合意味着将所有中间无状态操作与终端使用者合并为单个操作:

代码语言:javascript
复制
.map(x -> x.squash())
.filter(x -> x.getColor() != YELLOW)
.forEach(System.out::println)

整个管道被融合成单一的Consumer,直接连接到源。当处理每个元素时,源分配器只执行合并的使用者,流管道不会拦截任何内容,也不会执行任何额外的簿记操作。那是聚变。聚变不依赖于短路.可以在不进行融合的情况下实现流(执行一次操作、获取结果、执行下一次操作、在每次操作后将控件带回流引擎)。也有可能在不短路的情况下进行融合。

票数 50
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35150231

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档