spliterator()

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(),调用 Spliterators 的 spliterator() 方法,并将当前集合的引用传入

@Override
default Spliterator<E> spliterator() {
    return Spliterators.spliterator(this, 0);
}

 Spliterators

  • 静态类,以及方法,用于操作和创建 Spliterator 实例及其它原生特化实例

spliterator 方法

public static <T> Spliterator<T> spliterator(Collection<? extends T> c, int characteristics) {
    return new IteratorSpliterator<>(Objects.requireNonNull(c), characteristics);
}

文档说明

  • 基于 Iterator 的 spliterator
  • 使用给定集合的 iterator() 作为数据源,并且将 size() 返回的值作为初始大小,创建一个  Spliterator
  • 此 spliterator 是延迟绑定的,继承了集合的迭代器的“快速失败”的特性,并且实现了  trySplit() 用于有限的并行化

IteratorSpliterator

Spliterators 的内部类

文档说明

  • 一个使用了一个给定 Iterator 的 Spliterator 进行元素的操作,实现  trySplit() 用于有限的并行化
  • 持有所操作的集合对象的引用
public IteratorSpliterator(Collection<? extends T> collection, int characteristics) {
    this.collection = collection;
    this.it = null;
    this.characteristics = (characteristics & Spliterator.CONCURRENT) == 0
                           ? characteristics | Spliterator.SIZED | Spliterator.SUBSIZED
                           : characteristics;
}
  • 创建一个 spliterator,使用给定的集合的迭代器进行遍历,并且将集合 size() 作为初始的 size
posted @ 2019-09-15 11:19  飞蛇在水  阅读(1750)  评论(0编辑  收藏  举报