spliterator()
文档说明
- 创建一个分割迭代器(方法定义在 Iterable 接口)
- 实现类需要记录 spliterator 报告的 characteristic 值
- 但当 spliterator 报告了 size 或当前集合容器中无元素时,这个 characteristic值则无需报告
- 默认的实现需要被子类重写,返回一个更加高效的 spliterator
- 为了保留期望的 stream() 和 parallelStream() 的延迟行为,分割迭代器需要具有 IMMUTABLE 或 CONCURRENT 特性,或者设置为延迟绑定的(late-binding)
- 如果上述要求都无法实现,则重写的类需要去描写该分割迭代器的文档化的绑定策略,以及可能出现的修改的行为,并且还需要重写 stream() 和 parallelStream() 方法,通过 spliterator 的 Supplier 去创建流
- 这些要求确保了由 stream() 或 parallelStream() 生成的流在终止操作执行时能够反映出集合的内容
- 默认的实现是从集合的 Iterator 中创建了一个延迟绑定的 spliterator,这个 spliterator 继承了迭代器的 fail-fast(快速失败)属性
- 所创建出来的 spliterator 会包含 SIZED 特性值
- 同时,此 spliterator 还具有 SUBSIZED 特性值
- 若一个 spliterator 中没有元素,则特性值报告不会帮助客户端对 SIZED 与 SUBSIZED 以外的特性值进行控制、或进行专门的简化计算
- 这样可以确保了可以对空集合共享使用一个不可变的空的 spliterator 实例,并且可以确保客户能够判定该 spliterator 是否不包含任何元素
源码
Collection 中的 spliterator(),
@Override default Spliterator<E> spliterator() { return Spliterators.spliterator(this, 0); }