哪些操作保留了订单

Tob*_*ber 16 java java-8 java-stream

TL; DR; 我正在寻找一个可以查找某个中间操作或终端操作的地方.我在哪里可以找到这样的文件?

编辑这与如何确保java8流中的处理顺序不重复,因为该问题没有提供全面的操作清单.

背景

软件包的文件说:

流是否具有遭遇顺序取决于源和中间操作

这个优秀的stackoverflow答案中重复了这一点

为了确保整个流操作中的订购维护,您必须研究流的源,所有中间操作和终端操作的文档,以确定它们是否维护订单(或者源是否在第一个订单中有订单)地点).

这一切都很好,但我应该查看哪些文档?该软件包文件提到了这样的例子map,保证订货,但它没有一个详尽的清单.Stream类javadoc记录了一些中间操作,但不是全部.举个例子map:

返回一个流,该流包含将给定函数应用于此流的元素的结果.

这是一个中间操作.

要么 filter

返回由与此给定谓词匹配的此流的元素组成的流.

这是一个中间操作.

这些都没有描述它们是否保留了排序.

此stackoverflow回答声称:

实际上,每个中间操作都默认保留订单.唯一的例外是:

  • unordered(),它删除了排序约束.
  • sorted()改变了顺序.

如果没有明确指定,您可以假设操作保持订单.即使distinct()保持顺序,但它为并行流增加了很多复杂性.

但是有任何官方文件可以支持吗?

额外的功劳

实际上有两个单独的排序问题.

  1. 操作的输出是否与输入保持相同的顺序?
  2. 是否按顺序对每个元素执行操作.

例如,并行map操作可以以任意顺序遍历所有元素(违反2.),但仍然保持返回流中的顺序(服从1.)

Sta*_*lfi 17

在对源代码进行一些研究之后,我总结了以下表格:

摘自:Java流 - 第6部分 - Spliterator

下表显示了允许哪些操作类型修改字符:

|                        | 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)
  • Y - 允许有
  • P - 可能保留
  • C - 可能会清除.
  • 我 - 可以注射.
  • N - 无效; 与操作无关.

取自Java流 - 流方法特征表

下表显示了每个中间操作/终端操作可以打开和关闭的特征和标志:( SHORT_CIRCUIT仅在StreamOpFlag标志的上下文中相关)

注意:P除了带有CI(清除和注入)标志的单元格外,每个单元格都会添加(保留)标志.

|                  |  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 - 注入.