Spliterator 接口 控制StreamAPI并行拆分数据结构的策略

Spliterator是Java 8为并行处理设计的接口,它可以拆分数据结构,允许并行流操作。文章介绍了Spliterator的工作原理,包括trySplit方法用于拆分数据,以及如何通过特性来控制和优化处理。通过实例展示了如何实现自己的Spliterator以避免在并行处理字符串时出现错误。最后,讲解了如何使用自定义的WordCounterSpliterator来正确地并行计数单词。
摘要由CSDN通过智能技术生成

Spliterator

Spliterator 是Java 8新加入的一个接口:这个名字代表“可分迭代器”(splitable iterator)。

和Iterator 一样,Spliterator也用于遍历数据源中的元素,但他是为了并行执行而设计的

开发中一般不用自己开发Spliterator。

Java 8 已经为集合框架中包含的所有数据结构提供了一个默认的Spliterator实现。集合实现了Spliterator接口,接口提供了一个spliterator 方法。这个接口定了若干方法。

public interface Spliterator<T> {
    boolean tryAdvance(Consumer<? super T> action);
    Spliterator<T> trySplit();
    long estimateSize();
    int characteristics();
}

T 是Spliterator遍历的元素类型。

tryAdvance(试着前进)方法的行为类似于普通的Iterator,因为它会按顺序一个一个使用Spliterator中的元素,并且如果还有其他元素要遍历就返回true。

trySplit是专为Spliterator接口设计的,因为它可以把一些元素划出去分给第二个Spliterator(由该方法返回),让它们两个并行处理。Spliterator还可通过 estimateSize(估计大小)方法估计还剩下多少元素要遍历,因为即使不那么确切,能快速算出来世一个值也有助于让拆分均匀一点。

拆分过程

将Stream 拆分成多个部分的算法是一个递归过程。

如图所示,第一步是对第一个Spliterator调用trySplit,生成第二个Spliterator。第二步对这两个Spliterator调用trySplit,这样总共就有了四个Spliterator。这个框架不断对Spliterator调用trySplit直到它返回null,表名它处理的数据结构不能再分割,如第三步所示。最后,这个递归拆分过程到第四部就终止了,这时所有的Spliterator再调用trySplit时都返回了null。

递归拆分过程

拆分过程也受Spliteraotr本身的特性影响,而特性是通过characteristics方法声明的。

Spliterator 的特性

Spliterator接口声明的最后一个抽象方法是characteristics,它将返回一个int,代表Spliterator本身特性集的编码。使用Spliterator的客户可以用这些特性来更好地控制和优化它的使用。

表 7-2 Spliterator的特性

特性 含义
ORDERED 元素有特定的顺序(如List),因此Spliterator在遍历和划分时也会遵循这一顺序
DISTINCT 对于任意一对遍历过的元素x和y,x.eq
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值