Tob*_*ber 16 java java-8 java-stream
TL; DR; 我正在寻找一个可以查找某个中间操作或终端操作的地方.我在哪里可以找到这样的文件?
编辑这与如何确保java8流中的处理顺序不重复?,因为该问题没有提供全面的操作清单.
该软件包的文件说:
流是否具有遭遇顺序取决于源和中间操作
为了确保整个流操作中的订购维护,您必须研究流的源,所有中间操作和终端操作的文档,以确定它们是否维护订单(或者源是否在第一个订单中有订单)地点).
这一切都很好,但我应该查看哪些文档?该软件包文件提到了这样的例子map,保证订货,但它没有一个详尽的清单.Stream类的javadoc记录了一些中间操作,但不是全部.举个例子map:
返回一个流,该流包含将给定函数应用于此流的元素的结果.
这是一个中间操作.
要么 filter
返回由与此给定谓词匹配的此流的元素组成的流.
这是一个中间操作.
这些都没有描述它们是否保留了排序.
实际上,每个中间操作都默认保留订单.唯一的例外是:
- unordered(),它删除了排序约束.
- sorted()改变了顺序.
如果没有明确指定,您可以假设操作保持订单.即使distinct()保持顺序,但它为并行流增加了很多复杂性.
但是有任何官方文件可以支持吗?
实际上有两个单独的排序问题.
例如,并行map操作可以以任意顺序遍历所有元素(违反2.),但仍然保持返回流中的顺序(服从1.)
Sta*_*lfi 17
在对源代码进行一些研究之后,我总结了以下表格:
下表显示了允许哪些操作类型修改字符:
| | 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 |
Run Code Online (Sandbox Code Playgroud)
下表显示了每个中间操作/终端操作可以打开和关闭的特征和标志:( SHORT_CIRCUIT仅在StreamOpFlag标志的上下文中相关)
注意:P除了带有C和I(清除和注入)标志的单元格外,每个单元格都会添加(保留)标志.
| | 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 | | | | | |
Run Code Online (Sandbox Code Playgroud)
C - 清除. I - 注入.