哪些操作可以保留顺序

问题描述

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

摘自: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            |
  • Y-允许拥有
  • P-可能保留
  • C-可能会清除。
  • 我-可以注射。
  • N-无效;手术的抗癌药。

取自Java流- 流方法特征表

下表显示了每个 中间操作 / 终端操作 可以打开和关闭的特征和标志:(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

实际上有两个单独的订购问题。

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

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

猜你在找的技术问答相关文章

如何检查配对的蓝牙设备是打印机还是扫描仪(Android)
是否允许实体正文进行HTTP DELETE请求?
如何将ZipInputStream转换为InputStream?
java.util.logging Java 8中的变量
PowerMockito.doReturn返回null
Java中的RESTful调用
Swing / Java:如何正确使用getText和setText字符串
特殊字符和重音字符
Android Studio中的ndk.dir错误
错误“找不到主类”