在分析几年前同事的Java 7代码时,我发现他实现了一个实用程序,用于遍历数据,可能是并行的.他称其为Range,它扩展了Iterator接口.它有些新方法很难理解:
> int size()将给出范围的确切大小;
> Range split()会将范围分为两部分,最好(尽管不是必须的)将其大小相似(修改当前范围并创建一个新的范围);
> Range [] split(int n)会将范围分为N个子范围,可能会尝试使其尽可能均匀.
>尽管Iterator提供了void remove(),但其子类型仅引发UnsupportedOperationException.
我对自己说的是,这绝对是我们现在可以使用(小尺寸)分隔器执行的操作,从而利用了流API.但是,Java 8中的分隔器无法提供将n分割为多个部分的简便方法.
使用递归函数,我们可以将其分解为具有L个递归级别的n = 2 ^ L个部分,但是当n不是2的幂时,这种方法就不那么简单了,更不用说保持效用函数不自然了只是为了效果.
也许还可以说,只是避免弄乱分隔符,而让流在实际处理过程中进行由fork引起的分隔,但是ForkJoin策略可能不足以完成任务,并且不能保证它将使用我们专门希望用于该工作的线程.实际上,可能会在少数元素上执行繁重的任务.
问题可归结为以下几点:拥有一个至少具有SIZED和SUBSIZED特性的分离器,如何将其分离为精确数量的分离器?