【发布时间】:2015-02-25 09:59:57
【问题描述】:
在分析一位同事几年前的 Java 7 代码时,我发现他实现了一个用于遍历数据的实用程序,可能是并行的。他将其命名为Range,并扩展了Iterator 接口。它的一些新方法令人尴尬地熟悉:
-
int size()将给出范围的确切大小; -
Range split()会将范围分成 2 部分,最好但不一定在大小上相似(修改当前范围并创建一个新范围); -
Range[] split(int n)会将范围分成 N 个子范围,可能会尝试使它们尽可能均匀。 - 虽然
void remove()是从Iterator那里出现的,但它的子类型只是抛出UnsupportedOperationException。
我对自己说的是,这绝对是我们现在可以使用(缩小的)拆分器来做的事情,从而利用流 API。但是,Java 8 中的拆分器并没有提供一种简单的方法来拆分为 n 部分。
使用递归函数,我们可以将其拆分为 n = 2^L 部分和 L 递归级别,但是当 n 不是 2 的幂时,这种方法并不简单,更不用说感觉不自然为了效果而保留效用函数。
也有人可能会说简单地避免使用拆分器并让流在实际处理过程中执行由 fork 引起的拆分,但 ForkJoin 策略可能不适用于该任务,并且不保证它会使用我们特别希望用于该工作的线程数。事实上,可能会出现在少数元素上执行繁重任务的情况。
问题总结如下:拥有一个至少具有 SIZED 和 SUBSIZED 特征的拆分器,如何将其拆分为确切数量的拆分器?
【问题讨论】: