Java 8 中的 Spliterator

17 Mar 2025 | 5 分钟阅读

它类似于 Java 中用于遍历源(Collection、Generator 函数或 IO channel)元素的其他迭代器。Spliterator 是 Streams 的基础工具,尤其是并行 Streams。

为了对集合使用Spliterator,我们通过调用 Collection 接口中可用的 spliterator() 方法来创建一个 Spliterator 对象。

Spliterator 接口提供了以下八种方法

1. characteristics()

这是最重要的方法之一,用于获取此 Spliterator 及其元素的特征集。返回的结果来自以下选项:

  1. ORDERED(0x00000010)
  2. SIZED(0x00000040)
  3. SUBSIZED(0x00004000)
  4. IMMUTABLE(0x00000400)
  5. DISTINCT(0x00000001)
  6. SORTED(0x00000004)
  7. NONNULL(0x00000100)
  8. CONCURRENT(0x00001000)

characteristics() 方法的语法如下:

characteristics() 方法不接受任何参数,并以整数值编码的形式返回调用 spliterator 的特征。

2. estimateSize()

estimateSize() 方法用于获取剩余要迭代的元素数量的估计值。如果源是无限的、未知的或计算成本过高,它将返回 Long.MAX_VALUE

estimateSize() 方法的语法如下:

estimateSize() 方法不接受任何参数,并返回剩余要迭代的元素数量的估计值。

3. getExactSizeIfKnown()

它与 estimateSize() 方法类似。唯一的区别是,如果源是无限的、未知的或计算成本过高,getExactSizeIfKnown() 方法将返回 -1。

getExactSizeIfKnown() 方法的语法如下:

该方法不接受任何参数,并返回剩余要迭代的元素数量。

4. getComparator()

它用于对 Spliterator 的源进行排序。排序由 Comparator 完成,并将其作为结果返回。

getComparator() 方法的语法如下:

getComparator() 方法不接受任何参数,并返回以下值和异常:

  1. 它返回用于对 spliterator 的源进行排序的 comparator。
  2. 当源按自然顺序排序时,该方法返回 null。
  3. 当源未排序时,该方法会抛出 IllegalStateException。

5. hasCharacteristics()

hasCharacteristics() 方法用于识别 Spilitirator 的特征是否包含所有给定的特征。

hasCharacteristics() 方法的语法如下:

hasCharacteristics() 方法将 characteristics 作为参数,并在 spliterator 中存在给定特征时返回 true 或 false。

6. tryAdvance(Consumer <?super T> action)

tryAdvance() 方法用于对剩余元素执行给定操作并返回 true。如果没有元素,则返回 false。

当 Spliterator 有序时,将对下一个元素(按遇到的顺序)执行给定的操作。

tryAdvance() 方法的语法如下:

tryAdvance() 方法将 action 作为参数。如果存在下一个元素,则返回 true;如果剩余元素,则返回 false。

当指定的 action 为 null 时,它还可以抛出 NullPointerException

7. forEachRemaining(Consumer<?super T> action)

forEachRemaining() 方法用于在当前线程中按顺序对每个元素执行给定操作。它执行操作,直到 action 抛出 NullPointerException 或所有元素都已处理完毕。

当 spliterator 有序时,操作将按遇到的顺序执行。

forEachRemaining() 方法具有以下语法:

forEachRemaining() 方法将 action 作为参数,并返回 void。

当指定的 action 为 null 时,forEachRemaining() 方法还会抛出 NullPointerException。

8. Spliterator <T> trySplit()

trySplit() 方法仅在可能的情况下分割 spliterator,并返回一个指向分区新 spliterator 的引用。当 spliterator 无法分割时,它返回 null。

如果分割过程成功完成,原始 spliterator 将遍历序列的一部分,而返回的 spliterator 将遍历另一部分。

trySplit() 方法的语法如下:

trySplit() 方法不接受任何参数,并返回一个涵盖部分元素的 Spliterator,或者在 spliterator 无法分割时返回 null。

让我们通过一些示例来理解上述所有方法的用法。

SpliteratorExample1.java

输出

Spliterator in java 8

SpliteratorExample2.java

输出

Spliterator in java 8