Most visited

Recently visited

Added in API level 24

Spliterator

public interface Spliterator

java.util.Spliterator<T>
Known Indirect Subclasses


遍历和分割源的元素的对象。 例如,Spliterator覆盖的元素的来源可以是数组, Collection ,IO通道或生成器函数。

Spliterator可以单独遍历元素( tryAdvance() )或批量 forEachRemaining()forEachRemaining() )。

Spliterator也可以将其一些元素(使用trySplit() )作为另一个Spliterator进行分割,以用于可能并行的操作。 使用不能分裂的Spliterator进行操作,或者以非常不平衡或低效的方式进行操作,不太可能从并行性中受益。 穿越和分裂排气元件; 每个Spliterator仅适用于单个批量计算。

甲Spliterator还报告一组characteristics()选自其结构,源极和元件的ORDEREDDISTINCTSORTEDSIZEDNONNULLIMMUTABLECONCURRENT ,和SUBSIZED Spliterator客户可以使用这些控制,专门化或简化计算。 例如,CollectionCollection会报告SIZEDSet会报告DISTINCT ,而SortedSetSortedSet也会报告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提供用于intlong ,和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()遍历基元值不会影响转换为装箱值的值的顺序。

也可以看看:

Summary

Nested classes

interface Spliterator.OfDouble

Spliterator专门为double值。

interface Spliterator.OfInt

Spliterator专门为int值。

interface Spliterator.OfLong

Spliterator专门用于long值。

interface Spliterator.OfPrimitive<T, T_CONS, T_SPLITR extends OfPrimitive<T, T_CONS, T_SPLITR>>

专为原始值设计的Spliterator。

Constants

int CONCURRENT

特征值,表示元素源可以在没有外部同步的情况下由多个线程安全地同时修改(允许添加,替换和/或移除)。

int DISTINCT

特性值这标志着,对于每对遇到的元件 x, y!x.equals(y)

int IMMUTABLE

特征值,表示元素源不能进行结构修改; 也就是说,元素不能被添加,替换或删除,所以在遍历过程中不会发生这样的变化。

int NONNULL

特征值表示源保证遇到的元素不会是 null

int ORDERED

特征值,表示为元素定义了遇到次序。

int SIZED

表示在遍历或分裂之前从 estimateSize()返回的值的特征值表示有限大小,在没有结构源修改的情况下,表示完全遍历将遇到的元素的数量的精确计数。

int SORTED

特征值表示遇到顺序遵循定义的排序顺序。

int SUBSIZED

特征值这标志着从产生的所有Spliterators trySplit()将是既 SIZEDSUBSIZED

Public methods

abstract int characteristics()

返回此Spliterator及其元素的一组特征。

abstract long estimateSize()

返回 forEachRemaining(Consumer )遍历将遇到的元素数量的估计值,如果无限,未知或计算成本太高,则返回 MAX_VALUE

default void forEachRemaining(Consumer<? super T> action)

对当前线程中的每个剩余元素执行给定操作,直到处理完所有元素或操作抛出异常。

default Comparator<? super T> getComparator()

如果这个Spliterator的来源是 SORTEDComparator ,返回 Comparator

default long getExactSizeIfKnown()

返回的便捷方法 estimateSize()如果这Spliterator是 SIZED ,否则 -1

default boolean hasCharacteristics(int characteristics)

如果此Spliterator的 characteristics()包含所有给定特征,则返回 true

abstract boolean tryAdvance(Consumer<? super T> action)

如果剩余的元素存在,则对其执行给定的操作,返回true ; 否则返回false

abstract Spliterator<T> trySplit()

如果这个分割器可以被分割,返回一个Spliterator覆盖元素,当从这个方法返回时,不会被这个分割器覆盖。

Constants

CONCURRENT

Added in API level 24
int CONCURRENT

特征值,表示元素源可以在没有外部同步的情况下由多个线程安全地同时修改(允许添加,替换和/或移除)。 如果是这样,Spliterator预计会有一个关于遍历期间修改影响的文档化策略。

顶级Spliterator不应同时报告CONCURRENTSIZED ,因为如果在遍历期间同时修改源,有限大小(如果已知)可能会更改。 这样的Spliterator不一致,不能保证使用该Spliterator的任何计算。 如果子拆分大小是已知的,则子拆分器可以报告SIZED ,并且在遍历时不会反映源的添加或删除。

常量值:4096(0x00001000)

DISTINCT

Added in API level 24
int DISTINCT

特性值这标志着,对于每对遇到的元件x, y!x.equals(y) 这适用于例如基于Set

常数值:1(0x00000001)

IMMUTABLE

Added in API level 24
int IMMUTABLE

特征值,表示元素源不能进行结构修改; 也就是说,元素不能被添加,替换或删除,所以在遍历过程中不会发生这样的变化。 未报告IMMUTABLECONCURRENT预计会有一个有关遍历过程中检测到的结构干扰的文档化策略(例如投掷ConcurrentModificationException )。

常量值:1024(0x00000400)

NONNULL

Added in API level 24
int NONNULL

特征值表示源保证所遇到的元素不会是null (例如,这适用于大多数并发集合,队列和地图。)

常量值:256(0x00000100)

ORDERED

Added in API level 24
int ORDERED

特征值,表示为元素定义了遇到次序。 如果是这样,这个Spliterator保证方法trySplit()分割一个严格的元素前缀,该方法tryAdvance(Consumer )以前缀顺序forEachRemaining(Consumer )执行一个元素,并且该forEachRemaining(Consumer )以相遇顺序执行操作。

如果相应的iterator()记录订单,则Collection具有遇到订单。 如果是这样,遇到的订单与记录的订单相同。 否则,集合中没有遇到订单。

常量值:16(0x00000010)

SIZED

Added in API level 24
int SIZED

特征值表示在遍历或分裂之前从 estimateSize()返回的值表示有限大小,在没有结构源修改的情况下,表示完全遍历将遇到的元素的数量的精确计数。

常量值:64(0x00000040)

SORTED

Added in API level 24
int SORTED

特征值表示遇到顺序遵循定义的排序顺序。 如果是这样,方法getComparator()返回关联的比较,或者null如果所有元素都是Comparable ,并通过其自然顺序进行排序。

报告 SORTED也必须报告 ORDERED

常量值:4(0x00000004)

SUBSIZED

Added in API level 24
int SUBSIZED

特征值这标志着从产生的所有Spliterators trySplit()将是既SIZEDSUBSIZED (这意味着所有的儿童Spliterators,无论是直接的还是间接的,都将是SIZED

不按照 SIZED要求报告 SIZEDSUBSIZED不一致,也不能保证使用该Spliterator的任何计算。

常量值:16384(0x00004000)

Public methods

characteristics

Added in API level 24
int characteristics ()

返回此Spliterator及其元素的一组特征。 结果从表示为或运算值ORDEREDDISTINCTSORTEDSIZEDNONNULLIMMUTABLECONCURRENTSUBSIZED 重复调用characteristics()在给定的spliterator之前或在两者之间的调用, trySplit ,应始终返回相同的结果。

如果Spliterator报告一组不一致的特征(无论是从单个调用还是跨多个调用返回的特征),都不能保证使用此Spliterator的任何计算。

API Note:
  • The characteristics of a given spliterator before splitting may differ from the characteristics after splitting. For specific examples see the characteristic values SIZED, SUBSIZED and CONCURRENT.
Returns
int a representation of characteristics

estimateSize

Added in API level 24
long estimateSize ()

返回 forEachRemaining(Consumer )遍历将遇到的元素数量的估计值,如果计算结果无限,未知或成本太高,则返回 MAX_VALUE

如果此Spliterator为SIZED ,并且尚未部分遍历或拆分,或者此Spliterator为SUBSIZED且尚未部分遍历,则此估计必须是完整遍历可能遇到的元素的准确计数。 否则,这个估计可能是任意不准确的,但必须按照调用trySplit()规定降低。

API Note:
  • Even an inexact estimate is often useful and inexpensive to compute. For example, a sub-spliterator of an approximately balanced binary tree may return a value that estimates the number of elements to be half of that of its parent; if the root Spliterator does not maintain an accurate count, it could estimate size to be the power of two corresponding to its maximum depth.
Returns
long the estimated size, or Long.MAX_VALUE if infinite, unknown, or too expensive to compute.

forEachRemaining

Added in API level 24
void forEachRemaining (Consumer<? super T> action)

对当前线程中的每个剩余元素执行给定操作,直到处理完所有元素或操作抛出异常。 如果此Spliterator是ORDERED ,则按照相遇顺序执行操作。 该操作引发的异常会中继给调用者。

实现要求:
  • The default implementation repeatedly invokes 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

getComparator

Added in API level 24
Comparator<? super T> getComparator ()

如果这个Spliterator的来源是SORTEDComparator ,返回Comparator 如果来源是SORTED中的SORTED ,则返回null 否则,如果来源不是SORTED ,则抛出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.

getExactSizeIfKnown

Added in API level 24
long getExactSizeIfKnown ()

返回的便捷方法 estimateSize()如果这Spliterator是 SIZED ,否则 -1

实现要求:
  • The default implementation returns the result of estimateSize() if the Spliterator reports a characteristic of SIZED, and -1 otherwise.
Returns
long the exact size, if known, else -1.

hasCharacteristics

Added in API level 24
boolean hasCharacteristics (int characteristics)

如果此Spliterator的 characteristics()包含所有给定特征,则返回 true

实现要求:
  • The default implementation returns true if the corresponding bits of the given characteristics are set.
Parameters
characteristics int: the characteristics to check for
Returns
boolean true if all the specified characteristics are present, else false

tryAdvance

Added in API level 24
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

trySplit

Added in API level 24
Spliterator<T> trySplit ()

如果这个分割器可以被分割,返回一个Spliterator覆盖元素,当从这个方法返回时,不会被这个分割器覆盖。

如果此Spliterator为 ORDERED ,则返回的Spliterator必须覆盖元素的严格前缀。

除非此Spliterator覆盖无限数量的元素,否则重复调用trySplit()最终必须返回null 非空返回时:

  • the value reported for estimateSize() before splitting, must, after splitting, be greater than or equal to estimateSize() for this and the returned Spliterator; and
  • if this Spliterator is SUBSIZED, then estimateSize() for this spliterator before splitting must be equal to the sum of estimateSize() for this and the returned Spliterator after splitting.

此方法可能因任何原因返回 null ,包括空行,遍历开始后无法拆分,数据结构约束和效率考虑。

API Note:
  • An ideal 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

Hooray!