java1.8 Spliterator深入解读

1. 简介

       Spliterator=Split + Iterator,从命名上来看就可以理解该接口的作用:拆分 + 迭代器。该接口主要结合集合类使用,从1.8之后,JDK提供的大多数集合类都提供了spliterator()方法用来返回该类对应的Spliterator。这个接口风格和Iterator类似,每个集合类提供相应的Spliterator。和Iterator区别是,该接口提供的是支持分割的遍历方式,拆分之后就可以进行并行遍历,更加高效。

2. 说明

2.1. 关于接口的详细说明

      该接口用于拆分和遍历原集合的元素,支持的元素可以是:数组、Collection、IO通道,generator function。Spliterator支持单个遍历元素:tryAdvance,也支持批量遍历元素:forEachRemaining。Spliterator还可以将其某些元素拆分为另一个Spliterator,以便在并行操作中使用。如果使用的Spliterator不支持拆分,或者以高度不平衡或者低效的方式拆分,就无法受益于并行操作。每个Spliterator仅仅对一个单独的批量计算是有用的。

      Spliterator通过characteristics返回了结构和数据源的特点,包括:ORDERED(有序), DISTINCT(不重复),SORTED(可排序),SIZED(明确集合大小),NONNULL(所有元素非空),IMMUTABLE(不可更改),CONCURRENT(支持并发)和SUBSIZED(拆分的子Spliterator是SIZED)。使用Spliterator的调用方可以使用这些特点来控制、针对性的处理或者简化计算,比如:Collection会返回SIZED,Set会返回DISTINCT,SortedSet除了DISTINCT还有SORTED,这些特点是通过返回的整型数值中的每个bit来提现,判断方式:characteristics() & SORTED != SORTED,或者通过调用hasCharacteristics(characteristics)来判断(这也是该方法的默认实现)。一些特性还约束了方法的行为,比如:ORDERED,遍历方法必须确保提供的元素是有序的。未来可能会定义一些新的特性,所以不要对未定义的特性进行实现。

      如果Spliterator不包含IMMUTABLE和CONCURRENT特点,当Spliterator绑定到数据源后检测到数据源的结构发生,应该以文档的方式说明处理策略。后期绑定的Spliterator是指在第一次遍历、第一次分割、或第一次查询评估数量时绑定数据源,而不是在创建的时候绑定数据源;非后期绑定的Spliterator在调用构造函数或者第一次调用任何方法时绑定数据源,而在绑定之前对数据源所做的修改将在遍历Spliterator时都是能体现的。在Spliterator绑到数据源之后,如果检测到数据源结果发生任何变更,都要尽量抛出ConcurrentModificationException。Spliterators的这种行为称为快速报错,快速报错可以避免产生错误数据,调用forEachRemaining执行批量遍历操作时,应该优化这个遍历操作,并且在所有元素都被遍历完成之后再检测结构是否发生变化,而不是在遍历时检测每个元素并立即报错。

      Spliterators的estimateSize方法是用来评估剩余元素数量的大小,理想状态下,这个值会正好和要遍历的数量相等,言外之意是可能不相等,所以是评估数量;然而,即使无法知道精确值,这个评估值对应在这个数据源上的操作也是有价值的,比如:帮助确定是继续分割数据源还是直接遍历剩下的元素更加合适。

      尽管拆分器在并行算法中有明显的优势,但是它不一定是线程安全的。使用Spliterator来实现的并行算法要确保一个Spliterator在同一时间只能被一个线程使用。这通常很容易通过串行线程限制来实现,通过递归分解的方式来实现是一种典型的多线程算法:一个线程调用trySplit的方法,将返回的Spliterator移交给另外一个线程,该线程可以继续遍历或者进一步拆分然后移交给别的线程。如果有两个或者多个线程同一时间在相同的Spliterator上操作,那么拆分和遍历的结果将是不可预期的。如果原始线程将Spliterator移交给另外一个线程来处理,最好是在调用tryAdvance方法之前,因为某些条件在遍历之前有效,比如通过estimateSize来获取数据源的size的准确性。

      为原始类型提供了专门的Spliterator,包括的类型有:int, long,

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值