java - Stream.sorted().forEach() 是否按预期工作?

标签 java java-stream language-lawyer

<分区>

在处理 Java 项目时,我遇到了如下代码:

someMap.keySet().stream().sorted().forEach(/* ... */);

这里的意图显然是根据键的自然顺序为映射中的每个键做一些事情,这似乎是实际发生的事情。但是,我不确定这种行为是否得到保证。 The Javadoc for Stream#forEach说:

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.

我知道如果代码使用 .parallelStream()而不是 .stream()它不能保证工作,但由于它使用的是顺序流(Javadoc 没有说明任何内容),我不确定。这是否保证始终有效,或者该代码是否需要使用 .forEachOrdered()而不是 .forEach()是吗?

编辑:我相信这个问题不是 forEach vs forEachOrdered in Java 8 Stream 的重复问题,因为这个问题问的是“一般来说,forEach 和 forEachOrdered 之间的区别示例是什么”,而接受的答案基本上是“并行流”。这个问题专门针对顺序流。

最佳答案

不能保证 forEach 终端操作将按遇到的顺序处理元素,因此 “显然是不确定的”。尽管在当前的实现下,它应该按照流的遇到顺序处理顺序流的元素。

forEachOrdered 主要用于您正在使用并行流并希望在流具有已定义的遇到顺序的情况下遵守流的遇到顺序的情况。

在顺序流上使用 forEachforEachOrdered 会产生相同的效果,因此这是一个偏好问题。

如上所述,在当前的实现下,我们知道 forEach 终端操作应该按照流的遇到顺序处理顺序流的元素,但由于它没有在 java 文档中说明,所以它是如果您真的关心迭代顺序,最好保持观望并使用 forEachOrdered

关于java - Stream.sorted().forEach() 是否按预期工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48045510/

相关文章:

c++ - 在此实例中,三元运算符与 C 风格的指针向上转换相结合是否会调用未定义的行为?

java - JPA中表之间的关系是如何设置的?

java - 带有 AMQP 和 RabbitMQ 的 Spring,带有可选 x-dead-letter-exchange 的队列

javax.naming.NoInitialContextException : while running JUNIT test cases in webservices

lambda - 如何将整数流转换为java.awt.Point?

java - 如何使用 Java 8 流清除 HashMap 值内列表的内容

c++ - std::unordered_map<T,std::unique_ptr<U>> 可复制?海湾合作委员会错误?

java - Spring Boot启动后如何获取所有端点列表

java - 同时过滤和映射一个java流

c++ - 标准中哪里说不允许声明 `auto f()() ->int;`?