java - 将一个spliterator拆分成N个spliterator

标签 java java-8

在分析一位同事几年前的 Java 7 代码时,我发现他实现了一个可能并行遍历数据的实用程序。他称之为Range,它扩展了Iterator接口(interface)。它的一些新方法令人尴尬地熟悉:

  • int size() 会给出范围的确切大小;
  • Range split() 会将范围分成 2 部分,虽然不一定,但最好是大小相似(修改当前范围并创建新范围);
  • Range[] split(int n) 会将范围分成 N 个子范围,可能会尝试使它们尽可能均匀。
  • 尽管 void remove() 是来自 Iterator 的,但它的子类型只是抛出 UnsupportedOperationException

我对自己说的是,这绝对是我们现在可以使用(小型)拆分器做的事情,从而利用流 API。但是,Java 8 中的拆分器并未提供拆分成 n 部分的简单方法。

使用递归函数,我们可以将其拆分为 n = 2^L 部分,具有 L 递归级别,但是当 n 不是二的幂,更不用说仅仅为了效果而保留效用函数感觉很不自然。

有人可能还会说简单地避免乱用拆分器,让流在实际处理过程中进行 fork 引起的拆分,但是 ForkJoin 策略可能不太适合该任务,并且不能保证它会使用我们特别希望专用于该作业的线程数。事实上,可能存在对少量元素执行繁重任务的情况。

问题总结如下:有一个至少具有 SIZED 和 SUBSIZED 特征的拆分器,我怎样才能将它拆分为准确数量的拆分器?

最佳答案

实现它的方法是编写一个拆分器 wrapper,它使用自己的拆分策略,这甚至不是那么复杂,并且可以与现有的 F/J 支持框架进行互操作。您失去的是利用 native 随机访问结构的能力;您只能通过迭代内部 splitetator 的数据集来拆分。

可以引用我的earlier answer我在这里展示了分成预定大小的批处理的代码;只需适当的构造函数调用,就可以很容易地使其适应您的情况。

关于java - 将一个spliterator拆分成N个spliterator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28716001/

相关文章:

java - 使用 application.properties 初始化一个对象

java - 简单的字符串连接示例在 Java 7 中速度快,在 Java 8 中速度慢

java.lang.OutOfMemoryError : Java heap space for java 8 错误

Java 8 将多个可选参数映射到一个函数中

java - 是否有可能合理地模拟 yield-syntax,或许在 Java 8 的帮助下?

java - 是否值得使用 Selenium com.thoughtworks.selenium.Wait 类来等待? (表现)

java - 绘图功能没有达到我的预期

mysql - Java、Tomcat、MySQL 组合的安装程序

java - 如何在 Java 中声明泛型方法

java - Intellij Idea中使用 "Runtime.getRuntime().exec"方法时如何设置JAVA_HOME?