问题描述
在对源代码进行了一些研究之后,我总结了以下表格:
| | DISTICTS | SORTED | ORDERED | SIZED | SHORT_CIRCUIT |
| ---------------------- | -------- | ------ | ------- | ----- | --------------|
| source stream | Y | Y | Y | Y | N |
| intermediate operation | PCI | PCI | PCI | PC | PI |
| terminal operation | N | N | PC | N | PI |
- Y-允许拥有
- P-可能保留
- C-可能会清除。
- 我-可以注射。
- N-无效;手术的抗癌药。
下表显示了每个 中间操作 / 终端操作
可以打开和关闭的特征和标志:(SHORT_CIRCUIT
仅在StreamOpFlag
标志上下文中是相关的)
| | DISTINCT | SORTED | ORDERED | SIZED | SHORT_CIRCUIT |
| ---------------- | ----------| --------| ---------| -------| ---------------|
| filter | | | | C | |
| forEach | | | C | | |
| forEachOrdered | | | | | |
| allMatch | | | C | | I |
| distinct | I | | | C | |
| flatMap | C | C | | C | |
| anyMatch | | | C | | I |
| collect | | | | | |
| unOrdered | | | C | | |
| count | C | C | C | C | |
| findAny | | | C | | I |
| findFirst | | | | | I |
| flatMapToXXX | C | C | | C | |
| limit | | | | C | I |
| map | C | C | | | |
| mapToXXX | C | C | | | |
| max | | | | | |
| min | | | | | |
| noneMatch | | | C | | I |
| peek | | | | | |
| reduce | | | | | |
| skip | | | C | I | |
| sorted | | I | I | | |
| toArray | | | | | |
-
C
-清除。 -
I
-注射
解决方法
TL; DR; 我正在寻找一个可以查找特定中间操作或终端操作的地方。在哪里可以找到此类文档?
编辑
这不是如何确保java8流中的处理顺序的重复项?,因为该问题未提供完整的操作列表。
背景
该软件包的文件说:
流是否具有遇到顺序取决于源和中间操作
为了确保在整个流操作中维持顺序,您必须研究流源,所有中间操作和终端操作的文档,以了解它们是否维持顺序(或源是否在第一个顺序中具有顺序)地点)。
一切都很好,但是我应该看哪个文档?该软件包文档中的例子中提到,map
保证订货,但它没有一个详尽的清单。Stream类的javadoc文档记录了一些中间操作,但不是全部。举个例子map
:
返回一个流,该流包括将给定函数应用于此流的元素的结果。
这是一个中间操作。
要么
filter
返回一个包含与此给定谓词相匹配的流元素的流。
这是一个中间操作。
这些都没有描述它们是否保留顺序。
这个答案声称:
实际上,默认情况下,每个中间操作都会保留一个订单。唯一的例外是:
- unordered()删除排序约束。
- sorted()更改顺序。
如果未明确指定,则可以假定操作保持顺序。即使distinct()也会保持顺序,尽管这会增加并行流的复杂性。
但是有没有官方文件来支持呢?
额外信用credit
实际上有两个单独的订购问题。
- 操作的输出是否与输入保持相同的顺序?
- 是在每个元素上按顺序执行的操作。
例如,并行map
操作可以按任意顺序(违反2)遍历所有元素,但仍保持返回流中的顺序(遵守1)。