【问题标题】:Does stream use CHARACTERISTICS of the stream source?流是否使用流源的特征?
【发布时间】:2018-09-17 13:08:06
【问题描述】:

from this question

报告 IMMUTABLE 或 CONCURRENT 的拆分器保证永远不会抛出 ConcurrentModificationException。的 当然, CONCURRENT 在语义上排除了 SIZED ,但这没有 对客户端代码的影响。

事实上,这些特性并没有用于 Stream 中的任何东西 API,因此,不一致地使用它们永远不会被注意到 某处。

这也是为什么每个中间操作都有 清除 CONCURRENT、IMMUTABLE 和 NONNULL 的效果 特性:Stream 实现不使用它们,它的 表示流状态的内部类不维护它们。

如果流不使用源中的 CHARACTERISTICS,那么流如何并行工作? stream 是否完全忽略了流源特性?

from this question Collector 不知道我正在使用 Supplier 提供的并发集合,因此无法从收集器容器的类型推断特征

  1. 流 API 在什么情况下考虑特征?
  2. 哪个操作会重置哪个特征?

【问题讨论】:

  • 实现不使用这些特性。使用其他特征,例如 SIZEDSUBSIZED
  • 他们为什么不使用?所以如果我在排序流上调用 sorted() 它会再次运行并排序?如果流不使用spliterator 的特征,还有谁会使用它们。我个人认为没有任何理由使用 spliterator 拆分集合并手动优化它以并行运行。
  • 所以拆分器的行为基于其特征,而这些特征在流 API 中被遗忘了?
  • 引用的声明是专门谈论CONCURRENTIMMUTABLENONNULL。相比之下,ORDEREDDISTINCTSORTEDSIZEDSUBSIZED 被使用。并且当前未使用的特性将来可能会被使用。
  • “那么,如果我在已排序的流上调用 sorted(),它会再次运行并排序吗?” AFAIK,如果拆分器自然是 SORTED(关联的 Comparatornull),那么 SORTED 特性将在 Stream 标志中进行说明。

标签: java java-8 java-stream


【解决方案1】:

你所要求的可能的。这些答案中的正确措辞是目前这些属性被忽略,在将来它们可能会被流实现注入/读取/使用。

同样在你的 cmets 中,你这样说:

someTreeSet().stream()
         .sorted()
         .... some other operations 

将致电sorted。这根本不是真的,在这种情况下,该操作不会被调用。这是TreeSet 不会忽略并注入到流实现中的一个流标志。

【讨论】:

    猜你喜欢
    • 2021-09-19
    • 1970-01-01
    • 2012-04-26
    • 2022-09-24
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    • 2018-05-08
    • 1970-01-01
    相关资源
    最近更新 更多