1、LongStream.rangeClosed与iterate相比有两个优点
LongStream.rangeClosed直接产生原始类型long数字,没有拆箱装箱的开销
LongStream.rangeClosed会生成数字范围,很容易拆分为独立的小块。
2、分支/合并框架
(1)使用RecursiveTask
要把任务提交到这个池,必须创建RecursiveTask<R>的一个子类,其中R是并行化任务(以 及所有子任务)产生的结果类型,或者如果任务不返回结果,则是RecursiveAction类型(当 然它可能会更新其他非局部机构)。要定义RecursiveTask,只需实现它唯一的抽象方法 compute:
protected abstract R compute();
if (任务足够小或不可分) { 顺序计算该任务
} else {
将任务分成两个子任务 递归调用本方法,拆分每个子任务,等待所有子任务完成 合并每个子任务的结果
}
3. “可分迭代器”(splitable iterator)。和 Iterator 一样, Spliterator 也用于遍历数据源中的元素 .
public interface Spliterator<T> { boolean tryAdvance(Consumer<? super T> action); Spliterator<T> trySplit(); long estimateSize(); int characteristics();
}
注: tryAdvance 方法 会按顺序逐个使用 Spliterator 的元素,若还有其他元素要遍历则返回true
estimateSize方法估计还剩多少元素要遍历
特性 | 含义 |
ORDERED | 元素有既定的顺序(例如List),因此Spliterator在遍历和划分时也会遵循这一顺序 |
DISTINCT | 对于任意一对遍历过的元素x和y,x.equals(y)返回false |
SORTED | 遍历的元素按照一个预定义的顺序排序 |
SIZED | 该Spliterator由一个已知大小的源建立(例如Set),因此estimatedSize()返回的是准确值 |
NONNULL | 保证遍历的元素不会为null |
IMMUTABLE | Spliterator的数据源不能修改。这意味着在遍历时不能添加、删除或修改任何元素 |
CONCURRENT | 该Spliterator的数据源可以被其他线程同时修改而无需同步 |
SUBSIZED | 该Spliterator和所有从它拆分出来的Spliterator都是SIZED |