public interface Spliterator
java.util.Spliterator<T> |
Known Indirect Subclasses
Spliterator.OfDouble,
Spliterator.OfInt,
Spliterator.OfLong,
Spliterator.OfPrimitive<T, T_CONS, T_SPLITR extends
OfPrimitive<T, T_CONS, T_SPLITR>>,
Spliterators.AbstractDoubleSpliterator,
Spliterators.AbstractIntSpliterator,
Spliterators.AbstractLongSpliterator,
Spliterators.AbstractSpliterator<T>
|
遍历和分割源的元素的对象。 例如,Spliterator覆盖的元素的来源可以是数组, Collection
,IO通道或生成器函数。
Spliterator可以单独遍历元素( tryAdvance()
)或批量 forEachRemaining()
( forEachRemaining()
)。
Spliterator也可以将其一些元素(使用trySplit()
)作为另一个Spliterator进行分割,以用于可能并行的操作。 使用不能分裂的Spliterator进行操作,或者以非常不平衡或低效的方式进行操作,不太可能从并行性中受益。 穿越和分裂排气元件; 每个Spliterator仅适用于单个批量计算。
甲Spliterator还报告一组characteristics()
选自其结构,源极和元件的ORDERED
, DISTINCT
, SORTED
, SIZED
, NONNULL
, IMMUTABLE
, CONCURRENT
,和SUBSIZED
。 Spliterator客户可以使用这些控制,专门化或简化计算。 例如,Collection的Collection
会报告SIZED
的Set
会报告DISTINCT
,而SortedSet的SortedSet
也会报告SORTED
。 特征报告为简单的联合位集。 一些特征还限制了方法行为; 例如,如果ORDERED
,遍历方法必须符合他们记录的顺序。 未来可能会定义新的特征,因此实施者不应将意义分配给未列出的价值。
A Spliterator that does not report IMMUTABLE
or CONCURRENT
is expected to have a documented policy concerning: when the spliterator binds to the element source; and detection of structural interference of the element source detected after binding.在第一次遍历,第一次拆分或第一次查询估计大小时, 后期绑定的 Spliterator会绑定到元素的源,而不是在创建Spliterator时。 不具迟延约束力的 Spliterator在构建点或首次调用任何方法时都会绑定到元素的来源。 当Spliterator穿越时,反映在绑定之前对源进行的修改。 绑定Spliterator后,如果发现结构干扰, ConcurrentModificationException
最大努力抛出ConcurrentModificationException
。 这样做的Spliterators被称为快速失败 。 forEachRemaining()
的批量遍历方法( forEachRemaining()
)可能优化遍历并检查所有元素遍历后的结构干扰,而不是检查每个元素并立即失败。
Spliterators可以通过estimateSize()
方法提供剩余元素数量的估计。 理想情况下,如特征SIZED
,该值完全对应于在成功遍历中将遇到的元素数量。 然而,即使在不确切知道的情况下,估计的价值值对于在源上执行的操作仍可能是有用的,例如帮助确定是进一步分割还是顺序遍历剩余元素。
尽管它们在并行算法中有明显的用处,但是分割器不会是线程安全的; 相反,使用分割器的并行算法的实现应该确保分割器一次只能由一个线程使用。 这通常很容易通过串行线程约束来实现,这通常是通过递归分解工作的典型并行算法的自然结果。 一个调用trySplit()
的线程可以将返回的Spliterator移交给另一个线程,这个线程可能会遍历或进一步拆分该Spliterator。 如果两个或多个线程在同一分割器上同时操作,则分割和遍历的行为是不确定的。 如果原始线程将分离器传递给另一个线程进行处理,最好是在该任何元素与tryAdvance()
一起使用之前进行切换,因为某些保证(例如estimateSize()
器的SIZED
准确性)仅在遍历开始之前有效。
的原始亚型特Spliterator
提供用于int
, long
,和double
值。 子类型默认实现tryAdvance(java.util.function.Consumer)
和forEachRemaining(java.util.function.Consumer)
框原始值到其对应的包装类的实例。 这种拳击可能会破坏使用原始专业化获得的任何性能优势。 为了避免装箱,应该使用相应的基于原始的方法。 例如, tryAdvance(java.util.function.IntConsumer)
和forEachRemaining(java.util.function.IntConsumer)
应优先用于tryAdvance(java.util.function.Consumer)
和forEachRemaining(java.util.function.Consumer)
。 使用基于装箱的方法tryAdvance()
和forEachRemaining()
遍历基元值不会影响转换为装箱值的值的顺序。
也可以看看:
Nested classes |
|
---|---|
interface |
Spliterator.OfDouble Spliterator专门为 |
interface |
Spliterator.OfInt Spliterator专门为 |
interface |
Spliterator.OfLong Spliterator专门用于 |
interface |
Spliterator.OfPrimitive<T, T_CONS, T_SPLITR extends OfPrimitive<T, T_CONS, T_SPLITR>> 专为原始值设计的Spliterator。 |
Constants |
|
---|---|
int |
CONCURRENT 特征值,表示元素源可以在没有外部同步的情况下由多个线程安全地同时修改(允许添加,替换和/或移除)。 |
int |
DISTINCT 特性值这标志着,对于每对遇到的元件 |
int |
IMMUTABLE 特征值,表示元素源不能进行结构修改; 也就是说,元素不能被添加,替换或删除,所以在遍历过程中不会发生这样的变化。 |
int |
NONNULL 特征值表示源保证遇到的元素不会是 |
int |
ORDERED 特征值,表示为元素定义了遇到次序。 |
int |
SIZED 表示在遍历或分裂之前从 |
int |
SORTED 特征值表示遇到顺序遵循定义的排序顺序。 |
int |
SUBSIZED |
Public methods |
|
---|---|
abstract int |
characteristics() 返回此Spliterator及其元素的一组特征。 |
abstract long |
estimateSize() 返回 |
default void |
forEachRemaining(Consumer<? super T> action) 对当前线程中的每个剩余元素执行给定操作,直到处理完所有元素或操作抛出异常。 |
default Comparator<? super T> |
getComparator() 如果这个Spliterator的来源是 |
default long |
getExactSizeIfKnown() 返回的便捷方法 |
default boolean |
hasCharacteristics(int characteristics) 如果此Spliterator的 |
abstract boolean |
tryAdvance(Consumer<? super T> action) 如果剩余的元素存在,则对其执行给定的操作,返回 |
abstract Spliterator<T> |
trySplit() 如果这个分割器可以被分割,返回一个Spliterator覆盖元素,当从这个方法返回时,不会被这个分割器覆盖。 |
int CONCURRENT
特征值,表示元素源可以在没有外部同步的情况下由多个线程安全地同时修改(允许添加,替换和/或移除)。 如果是这样,Spliterator预计会有一个关于遍历期间修改影响的文档化策略。
顶级Spliterator不应同时报告CONCURRENT
和SIZED
,因为如果在遍历期间同时修改源,有限大小(如果已知)可能会更改。 这样的Spliterator不一致,不能保证使用该Spliterator的任何计算。 如果子拆分大小是已知的,则子拆分器可以报告SIZED
,并且在遍历时不会反映源的添加或删除。
常量值:4096(0x00001000)
int DISTINCT
特性值这标志着,对于每对遇到的元件x, y
, !x.equals(y)
。 这适用于例如基于Set
。
常数值:1(0x00000001)
int IMMUTABLE
特征值,表示元素源不能进行结构修改; 也就是说,元素不能被添加,替换或删除,所以在遍历过程中不会发生这样的变化。 未报告IMMUTABLE
或CONCURRENT
预计会有一个有关遍历过程中检测到的结构干扰的文档化策略(例如投掷ConcurrentModificationException
)。
常量值:1024(0x00000400)
int NONNULL
特征值表示源保证所遇到的元素不会是null
。 (例如,这适用于大多数并发集合,队列和地图。)
常量值:256(0x00000100)
int ORDERED
特征值,表示为元素定义了遇到次序。 如果是这样,这个Spliterator保证方法trySplit()
分割一个严格的元素前缀,该方法tryAdvance(Consumer
)
以前缀顺序forEachRemaining(Consumer
)
执行一个元素,并且该forEachRemaining(Consumer
)
以相遇顺序执行操作。
如果相应的iterator()
记录订单,则Collection
具有遇到订单。 如果是这样,遇到的订单与记录的订单相同。 否则,集合中没有遇到订单。
常量值:16(0x00000010)
int SIZED
特征值表示在遍历或分裂之前从 estimateSize()
返回的值表示有限大小,在没有结构源修改的情况下,表示完全遍历将遇到的元素的数量的精确计数。
常量值:64(0x00000040)
int SORTED
特征值表示遇到顺序遵循定义的排序顺序。 如果是这样,方法getComparator()
返回关联的比较,或者null
如果所有元素都是Comparable
,并通过其自然顺序进行排序。
报告 SORTED
也必须报告 ORDERED
。
常量值:4(0x00000004)
int SUBSIZED
特征值这标志着从产生的所有Spliterators trySplit()
将是既SIZED
和SUBSIZED
。 (这意味着所有的儿童Spliterators,无论是直接的还是间接的,都将是SIZED
)
不按照 SIZED
要求报告 SIZED
的 SUBSIZED
不一致,也不能保证使用该Spliterator的任何计算。
常量值:16384(0x00004000)
int characteristics ()
返回此Spliterator及其元素的一组特征。 结果从表示为或运算值ORDERED
, DISTINCT
, SORTED
, SIZED
, NONNULL
, IMMUTABLE
, CONCURRENT
, SUBSIZED
。 重复调用characteristics()
在给定的spliterator之前或在两者之间的调用, trySplit
,应始终返回相同的结果。
如果Spliterator报告一组不一致的特征(无论是从单个调用还是跨多个调用返回的特征),都不能保证使用此Spliterator的任何计算。
SIZED
, SUBSIZED
and CONCURRENT
.Returns | |
---|---|
int |
a representation of characteristics |
long estimateSize ()
返回 forEachRemaining(Consumer
)
遍历将遇到的元素数量的估计值,如果计算结果无限,未知或成本太高,则返回 MAX_VALUE
。
如果此Spliterator为SIZED
,并且尚未部分遍历或拆分,或者此Spliterator为SUBSIZED
且尚未部分遍历,则此估计必须是完整遍历可能遇到的元素的准确计数。 否则,这个估计可能是任意不准确的,但必须按照调用trySplit()
规定降低。
Returns | |
---|---|
long |
the estimated size, or Long.MAX_VALUE if infinite, unknown, or too expensive to compute. |
void forEachRemaining (Consumer<? super T> action)
对当前线程中的每个剩余元素执行给定操作,直到处理完所有元素或操作抛出异常。 如果此Spliterator是ORDERED
,则按照相遇顺序执行操作。 该操作引发的异常会中继给调用者。
tryAdvance(Consumer
)
until it returns false
. It should be overridden whenever possible.Parameters | |
---|---|
action |
Consumer : The action |
Throws | |
---|---|
NullPointerException |
if the specified action is null |
Comparator<? super T> getComparator ()
如果这个Spliterator的来源是SORTED
由Comparator
,返回Comparator
。 如果来源是SORTED
中的SORTED ,则返回null
。 否则,如果来源不是SORTED
,则抛出IllegalStateException
。
IllegalStateException
.Returns | |
---|---|
Comparator<? super T> |
a Comparator, or null if the elements are sorted in the natural order. |
Throws | |
---|---|
IllegalStateException |
if the spliterator does not report a characteristic of SORTED . |
long getExactSizeIfKnown ()
返回的便捷方法 estimateSize()
如果这Spliterator是 SIZED
,否则 -1
。
estimateSize()
if the Spliterator reports a characteristic of SIZED
, and -1
otherwise.Returns | |
---|---|
long |
the exact size, if known, else -1 . |
boolean hasCharacteristics (int characteristics)
如果此Spliterator的 characteristics()
包含所有给定特征,则返回 true
。
Parameters | |
---|---|
characteristics |
int : the characteristics to check for |
Returns | |
---|---|
boolean |
true if all the specified characteristics are present, else false |
boolean tryAdvance (Consumer<? super T> action)
如果剩余的元素存在,则对其执行给定的操作,返回true
; 否则返回false
。 如果此Spliterator为ORDERED
则将按照遇到顺序中的下一个元素执行操作。 该操作引发的异常会中继给调用者。
Parameters | |
---|---|
action |
Consumer : The action |
Returns | |
---|---|
boolean |
false if no remaining elements existed upon entry to this method, else true . |
Throws | |
---|---|
NullPointerException |
if the specified action is null |
Spliterator<T> trySplit ()
如果这个分割器可以被分割,返回一个Spliterator覆盖元素,当从这个方法返回时,不会被这个分割器覆盖。
如果此Spliterator为 ORDERED
,则返回的Spliterator必须覆盖元素的严格前缀。
除非此Spliterator覆盖无限数量的元素,否则重复调用trySplit()
最终必须返回null
。 非空返回时:
estimateSize()
before splitting, must, after splitting, be greater than or equal to estimateSize()
for this and the returned Spliterator; andSUBSIZED
, then estimateSize()
for this spliterator before splitting must be equal to the sum of estimateSize()
for this and the returned Spliterator after splitting.此方法可能因任何原因返回 null
,包括空行,遍历开始后无法拆分,数据结构约束和效率考虑。
trySplit
method efficiently (without traversal) divides its elements exactly in half, allowing balanced parallel computation. Many departures from this ideal remain highly effective; for example, only approximately splitting an approximately balanced tree, or for a tree in which leaf nodes may contain either one or two elements, failing to further split these nodes. However, large deviations in balance and/or overly inefficient trySplit
mechanics typically result in poor parallel performance.Returns | |
---|---|
Spliterator<T> |
a Spliterator covering some portion of the elements, or null if this spliterator cannot be split |