作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在分析一位同事几年前的 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/
我是一名优秀的程序员,十分优秀!