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

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

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

显然,这里的意图是根据键的自然顺序对地图中的每个键执行操作,这似乎确实是在发生的事情。但是,我不确定这种行为是否得到保证。 The Javadoc for Stream#forEach说:

该操作的行为明确地是不确定的。对于并行流管道,此操作不能保证尊重流的遇到顺序,因为这样做会牺牲并行性的好处。对于任何给定的元素,可以在库选择的任何时间和线程中执行操作。

我知道,如果代码使用的是 .parallelStream() 而不是 .stream() ,则不能保证它能正常工作,但是由于它使用的是顺序流(Javadoc对此没有任何说明),所以我不确定。这是否可以保证始终有效,还是要使用 .forEachOrdered() 而不是 .forEach() 来使代码生效?

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

参考方案

不能保证forEach终端操作将按遇到顺序处理元素,因此“明确地是不确定的”。尽管在当前实现下,它应按流的遇到顺序处理顺序流的元素。
forEachOrdered主要用于以下情况:您使用并行流,并且如果流具有定义的遇到顺序,则希望遵守该流的遇到顺序。

在顺序流上使用forEachforEachOrdered将具有相同的效果,因此这是优先选择的问题。

如上所述,在当前实现中,我们知道forEach终端操作应按流的遇到顺序处理顺序流的元素,但由于Java文档中未对此进行说明,因此最好坐在围栏上并使用forEachOrdered您真的很在乎迭代顺序。

Java 8`Stream`可以并行运行,甚至不需要您吗? - java

如我所见,在使用Java 8 Stream时,显而易见的代码无论是“对象”流还是原始流(即IntStream和朋友)都将仅使用:someStreamableResource.stream().whatever() 但是,然后,相当多的“流媒体资源”也有了.parallelStream()。读取javadoc时不清楚的是.stream()流是否始终是顺序的,以…

JAVA 8具有任何匹配属性的对象的过滤器列表 - java

我的要求是通过匹配任何属性的字符串来过滤对象列表。例如,假设Contact类具有三个属性:街道,城市,电话。我知道java流过滤器是如何工作的,在这里我必须将输入字符串与每个属性进行比较,如下所示:contactList.stream().filter(contact -> contact.getStreet().equals("dubai&…

检查Optional中是否存在null属性,并返回String Java Stream API - java

我有以下class Person private String firstName; private String familyName; // Setters and Getters 我有以下方法public String getFullName(Optional<Person> persons) { return persons .map(p…

Java 8流:处理空值 - java

以下代码为属性Salary为null抛出NPE。class Person具有以下属性:字符串:name,整数:age,整数:薪金salary在此处可以为null。我想创建一份工资清单。persons.stream().mapToDouble(Person::getSalary).boxed().collect(Collectors.toList())在这里,…

Java 8 Streams过滤和收集是否返回对列表中相同对象的引用? - java

例如考虑下面的代码List<Reference> references = context.getReferences() .stream() .filter(ref -> ref.getCondition() == SOMETHING_DESIRABLE) .collect(Collectors.toList()); 现在,如果我更改了引…