Java Spliterator.trySplit() 方法及代码示例
尝试分割当前的可拆分迭代器
定义
Spliterator<T> trySplit()
返回值
返回一个涵盖元素的某些部分的 Spliterator
,如果这个 Spliterator
不能被拆分, 则返回 null
.
说明
如果当前 Spliterator
可以拆分, 则返回一个涵盖元素的 Spliterator
, 那将取决于方法的返回, 而不是当前 Spliterator
的元素涵盖情况.
如果这个 Spliterator
是 ORDERED
的, 则返回的 Spliterator
必须严格涵盖当前 Spliterator
的头部元素.
除非这个 Spliterator
涵盖无限的元素, 否则重复调用 tryssplit()
最终必然返回 null
. 是否非空返回取决于:
- 拆分前
estimateSize()
返回的值, 在拆分后必须大于或等于estimateSize()
和返回的Spliterator
的estimateSize()
之和, 以及 - 如果这个
Spliterator
是SUBSIZED
的, 那么这个Spliterator
在分割前的estimateSize()
必须等于estimateSize()
和返回的Spliterator
的estimateSize()
之和
该方法可能会由于任何原因而返回 null
, 包括空、遍历开始后无法拆分的、数据结构约束的和处于效率考虑的
注意事项
API 注意事项:
尽管理想化的 trySplit()
方法会有效地(无需遍历)将其元素精确地一分为二, 从而实现均衡的并行计算. 但许多偏离这一理想化的方法仍然非常有效; 例如, 仅对近似均衡的树进行近似拆分, 或者对于叶子节点可能包含一个或两个元素的树, 不会进一步拆分这些节点. 然而, 均衡偏差过大抑或过度低效的 trySplit()
机制通常会导致并行性能不佳.
示例
拆分可拆分迭代器的示例
package com.yi21.spliterator; import java.util.Set; import java.util.Spliterator; import java.util.stream.Stream; public class Yi21SpliteratorTrySplit { public static void main(String[] args) { Set<String> set = Set.of("One Elemet"); Spliterator<String> iterator = set.spliterator(); System.out.println("拆分单个元素的 set: " + iterator.trySplit()); set = Set.of("One", "Two", "Tree"); iterator = set.spliterator(); Spliterator<String> iterator1 = iterator.trySplit(); System.out.println("尝试拆分3个元素的 set 后:"); System.out.println("原迭代器的遍历: "); iterator.forEachRemaining(System.out::println); System.out.println("新迭代器的遍历: "); iterator1.forEachRemaining(System.out::println); //无限的流生成的迭代器 Spliterator<Integer> infiniteIterator = Stream.iterate(0, i -> i + 2).spliterator(); System.out.println("无限元素迭代器的拆分? " + infiniteIterator.trySplit()); } }
执行结果为 :
拆分单个元素的 set: null 尝试拆分3个元素的 set 后: 原迭代器的遍历: 新迭代器的遍历: Two One Tree 无限元素迭代器的拆分? java.util.Spliterators$ArraySpliterator@3f102e87