我试图对Java streams API中的惰性评估的应用形成一个统一的理解。
以下是我目前理解的:
我想做的是把所有这些想法汇集在一起,并确保我没有歪曲任何东西。我发现它很棘手,因为每当我阅读任何关于Java流的文献时,它就会继续说它们是懒惰的或使用懒惰的评估,然后就开始谈论诸如融合和短路之类的优化。
那么我这样说对吗?
>
融合是如何在流API中实现惰性求值的--即消耗一个元素,并尽可能地将操作融合在一起。我在想,如果核聚变不存在,那么我们肯定会回到急切的评估,因为另一种选择是在进入下一个操作之前处理每一个中间操作的所有元素?
短路是可能的,不需要融合或惰性评估,但在流的上下文中,这两个原则的实现很有帮助?
我希望能对此有进一步的了解和澄清。
至于聚变。让我们想象一下下面的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
,它直接连接到源。当处理每个单个元素时,源分割器只是执行组合的使用者,流管道不截取任何东西,也不执行任何额外的记账。那是聚变。聚变不依赖于短路。可以在没有融合的情况下实现流(执行一个操作,获取结果,执行下一个操作,将每个操作后的控制权带回流引擎)。也有可能在没有短路的情况下进行聚变。
本文向大家介绍Java 流 vs Writer/Reader API,包括了Java 流 vs Writer/Reader API的使用技巧和注意事项,需要的朋友参考一下 示例 流提供对二进制内容的最直接访问,因此任何InputStream/OutputStream实现始终在ints和bytes上操作。 有一些例外,可能最显着的例外是PrintStream添加了“方便地打印各种数据值的表示形式的能
问题内容: 列表,队列和集合之间有什么区别? 问题答案: 简单来说: 一个 列表 是一个对象,在同一个对象可能出现不止一次的有序列表。例如:[1,7,1,3,1,1,1,5]。谈论列表中的“第三要素”是有意义的。您可以在列表中的任何位置添加元素,在列表中的任何位置更改元素,或从列表中的任何位置删除元素。 一个 队列 也定购,但你永远只触摸元件的一端。所有元素都在队列的“结尾”处插入,并从队列的“开
什么时候使用和?有没有人有好的、具体的例子来说明什么时候走一条路或者走另一条路更好呢? Javadoc提到collect()是一个可变约简。 以上的说法是猜测,然而,我希望一个专家在这里插话。
问题内容: 他们的安全性是否相等?我被告知使用 安全性较低,并且会减慢页面加载时间。我严格偏向使用echo。 优点/缺点是什么? 问题答案: 和称为短开放标记,并不总是在PHP 5.3或更低版本中启用(请参阅指令)(但自PHP 5.4.0起,始终可用)。 实际上,在PHP 5.3.0随附的php.ini-production文件中,默认情况下禁用它们: 因此,在要分发的应用程序中使用它们可能不是一
这是一个概念性问题。在我的例子中,我使用slick.js为一个网站创建了一个图像旋转木马。由于这些是高分辨率照片,我希望通过允许异步加载照片而不是页面加载来加快页面加载时间。 在浏览这个库的文档时,我看到了“lazyLoad”属性的可用设置,但对于这些设置在实践中的意义,我几乎没有什么信息。 本质上,我的问题是,在延迟加载的环境中,渐进式和按需式之间有什么区别。
问题内容: 在下面的查询 如果我有2个单独的索引,一个在 col3上 ,另一个在 col4上 ,则此查询中将使用哪个索引? 我在某处读到,查询中的每个表仅使用一个索引。这是否意味着查询无法使用两个索引? 其次,如果我同时使用 col3* 和 col4 创建了一个复合索引,但仅在 WHERE 子句中使用了 col3 ,那么性能会更糟吗?例: * 最后,在所有情况下仅使用Covering索引是否更好?