我必须承认,当我第一次尝试找出特性的实际含义时,我也遇到了困难,并且感觉到它们的含义在Java 8的实现阶段没有被明确地确定,因此使用起来不一致。
考虑
Spliterator.IMMUTABLE:
表示元素来源无法进行结构修改的特征值;也就是说,不能添加,替换或删除元素,因此在遍历期间不会发生此类更改。
看到此列表中的“已替换”很奇怪,当谈到a
List或数组时,通常不将其视为结构修改,因此,流和分离器工厂接受数组(未克隆)的报告
IMMUTABLE,例如
LongStream.of(…)或
Arrays.spliterator(long[])。
如果我们将其更宽泛地解释为“只要客户端无法观察到”,则不会有显着差异
CONCURRENT,因为在两种情况下,都会向客户端报告 某些
元素,而无法识别在遍历期间是否添加了 这些 元素,或者是否由于无法移除,有些未报告,因为无法倒带分隔器并进行比较。
规范继续:
一个没有报告
IMMUTABLE或CONCURRENT预期具有ConcurrentModificationException关于遍历过程中检测到的结构性干扰的书面策略(例如throw)的分隔器。
这是唯一相关的事情,保证分隔符报告
IMMUTABLE或
CONCURRENT永远不会抛出
ConcurrentModificationException。当然,从语义上
CONCURRENT排除
SIZED,但这对客户端代码没有影响。
实际上,这些特性在Stream API中并未用于任何用途,因此,不一致地使用它们将永远不会在某处引起注意。
这也是的解释,为什么 每个
中间操作中具有清热的效果
CONCURRENT,
IMMUTABLE和
NONNULL特性:数据流实现不使用它们,代表流状态的内部类不维护他们。
同样,
NONNULL在任何地方都不会使用它,因此某些流没有它不会起作用。我可以将
LongStream.of(…)问题归结为内部使用
Arrays.spliterator(long[],int, int)哪些代表
Spliterators.spliterator(long[] array, int fromIndex, int toIndex, intadditionalCharacteristics):
返回的分隔符始终报告特性
SIZED和SUBSIZED。调用方可以为分隔符提供其他特征以进行报告。(例如,如果知道不会进一步修改数组,请指定IMMUTABLE;如果认为数组数据具有相遇顺序,请指定ORDERED)。该方法Arrays.spliterator(long[],int,int)通常可以替代地使用,它返回一个spliterator该报告SIZED,SUBSIZED,IMMUTABLE,和ORDERED。
再次注意该
IMMUTABLE特性的不一致用法。它被再次处理等不必保证不存在任何变形,而在同一时间,
Arrays.spliterator并依次
Arrays.stream和
LongStream.of(…)将报告
IMMUTABLE特性,即使是规格,而不能保证呼叫方将不会修改他们的阵列。除非我们考虑将元素设置为非结构性修改,否则整个区别将再次变得无意义,因为数组无法进行结构性修改。
而且它明确规定没有
NONNULL特征。很明显,原始值不能为
null,并且
Spliterator.Abstract<Primitive>Spliterator类始终注入
NONNULL特性,但返回的分隔符
Spliterators.spliterator(long[],int,int,int)不会继承自
Spliterator.AbstractLongSpliterator。
不好的是,这不能在不更改规格的情况下得到解决,而好的事情是,它没有任何后果。
因此,如果我们忽略了任何问题
CONCURRENT,
IMMUTABLE或者
NONNULL,它们没有什么后果,我们有
SIZED和
skip&
limit。这是一个众所周知的问题,是这种方法的结果,
skip并且
limit已由Stream
API实现。其他实现是可以想象的。这也适用于无限流与的组合,该组合
limit应具有可预测的大小,但考虑到当前的实现,则没有。
Stream.concat(…)与结合
Stream.empty()。这听起来是合理的空流并 没有
结果顺序施加约束。但是
Stream.concat(…)当只有一个输入没有命令时,释放命令的行为值得怀疑。请注意,对订购太过激进并不是什么新鲜事,有关此行为的问与答(首先被认为是有意为之,但后来在Java
8,update 60中已得到修复)。也许
Stream.concat在此时也应该进行讨论…
的行为
.boxed()很容易解释。当像天真那样实施时
.mapToObj(Long::valueOf),它将简单地失去所有知识,因为
mapToObj不能假设结果仍然是排序或不同的。但这已在Java
9中修复。那里
LongStream.range(0,10).boxed()具有一些
SUBSIZED|SIZED|ORDERED|SORTED|DISTINCT特性,可以维护与实现相关的所有特性。



