【发布时间】:2018-09-17 13:08:06
【问题描述】:
报告 IMMUTABLE 或 CONCURRENT 的拆分器保证永远不会抛出 ConcurrentModificationException。的 当然, CONCURRENT 在语义上排除了 SIZED ,但这没有 对客户端代码的影响。
事实上,这些特性并没有用于 Stream 中的任何东西 API,因此,不一致地使用它们永远不会被注意到 某处。
这也是为什么每个中间操作都有 清除 CONCURRENT、IMMUTABLE 和 NONNULL 的效果 特性:Stream 实现不使用它们,它的 表示流状态的内部类不维护它们。
如果流不使用源中的 CHARACTERISTICS,那么流如何并行工作? stream 是否完全忽略了流源特性?
from this question Collector 不知道我正在使用 Supplier 提供的并发集合,因此无法从收集器容器的类型推断特征
- 流 API 在什么情况下考虑特征?
- 哪个操作会重置哪个特征?
【问题讨论】:
-
实现不使用这些特性。使用其他特征,例如
SIZED和SUBSIZED。 -
他们为什么不使用?所以如果我在排序流上调用 sorted() 它会再次运行并排序?如果流不使用
spliterator的特征,还有谁会使用它们。我个人认为没有任何理由使用spliterator拆分集合并手动优化它以并行运行。 -
所以拆分器的行为基于其特征,而这些特征在流 API 中被遗忘了?
-
引用的声明是专门谈论
CONCURRENT、IMMUTABLE和NONNULL。相比之下,ORDERED、DISTINCT、SORTED、SIZED和SUBSIZED被使用。并且当前未使用的特性将来可能会被使用。 -
“那么,如果我在已排序的流上调用 sorted(),它会再次运行并排序吗?” AFAIK,如果拆分器自然是
SORTED(关联的Comparator是null),那么SORTED特性将在 Stream 标志中进行说明。
标签: java java-8 java-stream