gpt4 book ai didi

java - Stream.forEach 是否尊重顺序流的相遇顺序?

转载 作者:IT老高 更新时间:2023-10-28 20:35:27 29 4
gpt4 key购买 nike

Stream.forEach 的 Javadoc说(强调我的):

The behavior of this operation is explicitly nondeterministic. For parallel stream pipelines, this operation does not guarantee to respect the encounter order of the stream, as doing so would sacrifice the benefit of parallelism. For any given element, the action may be performed at whatever time and in whatever thread the library chooses. If the action accesses shared state, it is responsible for providing the required synchronization.

Java 9 Early Access Javadoc 中存在相同的文本.

第一句(“明确地不确定”)暗示(但没有明确说明)这种方法不保留遇到顺序。但是下一个明确表示不保留顺序的句子以“对于并行流管道”为条件,如果无论并行性如何都应用该句子,则该条件将是不必要的。这让我不确定 forEach 是否保留顺序流的遭遇顺序。

This answer指出流库实现 calls .sequential().forEach(downstream) 的地方.这表明 forEach 旨在保留顺序流的顺序,但也可能只是库中的一个错误。

为了安全起见,我使用 forEachOrdered 在自己的代码中避开了这种歧义,但今天我发现 NetBeans IDE 的“使用功能操作”编辑器提示会转换

for (Foo foo : collection)
foo.bar();

进入

collection.stream().forEach((foo) -> {
foo.bar();
});

如果 forEach 不保留遇到顺序,则会引入一个错误。举报前a bug against NetBeans ,我想知道库实际上保证了什么,由源支持。

我正在寻找权威来源的答案图。这可能是库实现中的明确评论,Java 开发邮件列表上的讨论(Google 没有为我找到任何东西,但也许我不知道神奇的词),或者库设计者的声明(我知道两个 Brian GoetzStuart Marks 在 Stack Overflow 上处于 Activity 状态)。 (请不要回答“只使用 forEachOrdered”——我已经这样做了,但我想知道没有错误的代码。)

最佳答案

规范的存在是为了描述调用者可以依赖的最小保证,而不是描述实现的功能。这一差距至关重要,因为它允许实现灵 active 发展。 (规范是声明性的;实现是必要的。)过度规范与规范不足一样糟糕。

当规范说“不保留属性 X”时,并不意味着可能永远不会观察到属性 X;这意味着实现没有义务保留它。您声称永远不会保留遇到顺序的暗示只是一个错误的结论。 (HashSet 不保证迭代它的元素会保留它们被插入的顺序,但这并不意味着这不会意外发生——你不能指望它。)

同样,您的“暗示 forEach 旨在保留顺序流的顺序”的含义是因为您看到在某些情况下这样做的实现同样不正确。

在这两种情况下,您似乎对规范为 forEach 提供了很大的自由这一事实感到不舒服。具体来说,它可以自由地不保留顺序流的遇到顺序,即使这是实现当前所做的,而且很难想象一个实现会不按顺序处理顺序源。但这就是规范所说的,也是它想要表达的。

也就是说,关于并行流的评论的措辞可能会令人困惑,因为仍然可能会误解它。在这里明确指出平行案例的目的是为了教学。完全删除该句子后,规范仍然非常清楚。但是,对于不了解并行性的读者来说,几乎不可能假设 forEach 会保留遇到顺序,因此添加了这句话以帮助阐明动机.但是,正如您所指出的,特殊处理顺序案例的愿望仍然非常强烈,进一步澄清将是有益的。

关于java - Stream.forEach 是否尊重顺序流的相遇顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34247318/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com