# Java `Spliterator`接口

> 原文： [https://howtodoinjava.com/java/collections/java-spliterator/](https://howtodoinjava.com/java/collections/java-spliterator/)

Java `Spliterator`接口是一个内部迭代器，可将[流](https://howtodoinjava.com/java8/java-8-tutorial-streams-by-examples/)分解为较小的部分。 这些较小的零件可以并行处理。

在实际编程中，我们可能永远不需要直接使用**分离器**。 在正常操作下，它的行为将与 Java [**迭代器**](https://howtodoinjava.com/java/collections/java-iterator/)完全相同。

```java
Spliterator<T> spliterator = list.spliterator();

```

Java 集合类提供默认的`stream()`和`parallelStream()`方法，这些方法在内部通过调用`splitter()`来使用`Spliterator()`。 它有助于并行处理收集数据。

```java
default Stream<E> stream() {
    return StreamSupport.stream(spliterator(), false);
}

default Stream<E> parallelStream() {
    return StreamSupport.stream(spliterator(), true);
}

```

## 1\. Java `Spliterator`特性

以下是 Java 中`Spliterator`提供的特性列表。

1.  在 [Java 8](https://howtodoinjava.com/java-8-tutorial/) 中引入了分离器。
2.  它为任何集合的元素流的并行处理提供支持。
3.  它提供`tryAdvance()`方法来分别迭代不同线程中的元素。 它有助于并行处理。
4.  要在单个线程中顺序迭代元素，请使用 `forEachRemaining()`方法。
5.  如果可能，使用`trySplit()`方法对分割器进行分区。
6.  它有助于将`hasNext()`和`next()`操作组合为一种方法。

## 2\. Java `Spliterator`方法

1.  **`int features()`**：返回分离器的特性列表。 它可以是`ORDERED`，`DISTINCT`，`SORTED`，`SIZED`，`NONNULL`，`IMMUTABLE`，`CONCURRENT`和`SUBSIZED`中的任何一个。
2.  **`long EstimateSize()`**：返回`forEachRemaining()`遍历将遇到的元素数量的估计值；如果无限，未知或计算成本太高，则返回`Long.MAX_VALUE`。
3.  **`default void forEachRemaining(Consumer action)`**：依次对当前线程中的每个剩余元素执行给定的操作，直到所有元素都已处理或该动作引发异常。
4.  **`default comparator getComparator()`**：如果分离器的源由比较器排序，则返回该比较器。
5.  **`default long getExactSizeIfKnown()`**：如果此分离器为`SIZED`，则返回`estimateSize()`，否则为 -1。
6.  **`default boolean hasCharacteristics(int features)`**：如果`spliterator`的`features()`包含所有给定的特征，则返回`true`。
7.  **`boolean tryAdvance(Consumer action)`**：如果存在剩余元素，则对其执行给定操作，并返回`true`； 否则返回`false`。
8.  **`Spliterator trySplit()`**：如果可以对分离器进行分区，则返回一个覆盖元素的`Spliterator`，从该方法返回后，该分离器将不覆盖该元素。

## 3\. Java `Spliterator`示例

#### 3.1 `Spliterator`特性示例

验证从[`ArrayList`](https://howtodoinjava.com/java-arraylist/)获得的`Spliterator`特性的 Java 示例。

```java
ArrayList<String> list = new ArrayList<>();

Spliterator<String> spliterator = list.spliterator();

int expected = Spliterator.ORDERED | Spliterator.SIZED | Spliterator.SUBSIZED;

System.out.println(spliterator.characteristics() == expected);	//true

if (spliterator.hasCharacteristics(Spliterator.ORDERED)) {
    System.out.println("ORDERED");
}

if (spliterator.hasCharacteristics(Spliterator.DISTINCT)) {
    System.out.println("DISTINCT");
}

if (spliterator.hasCharacteristics(Spliterator.SORTED)) {
    System.out.println("SORTED");
}

if (spliterator.hasCharacteristics(Spliterator.SIZED)) {
    System.out.println("SIZED");
}

if (spliterator.hasCharacteristics(Spliterator.CONCURRENT)) {
    System.out.println("CONCURRENT");
}

if (spliterator.hasCharacteristics(Spliterator.IMMUTABLE)) {
    System.out.println("IMMUTABLE");
}

if (spliterator.hasCharacteristics(Spliterator.NONNULL)) {
    System.out.println("NONNULL");
}

if (spliterator.hasCharacteristics(Spliterator.SUBSIZED)) {
    System.out.println("SUBSIZED");
}

```

程序输出。

```java
true

ORDERED
SIZED
SUBSIZED

```

#### 3.2 `Spliterator estimateSize()`和`getExactSizeIfKnown()`示例

Java 示例，用于获取支持集合的大小，即由 spliterator 迭代的元素数量。

```java
ArrayList<String> list = new ArrayList<>();

list.add("A");
list.add("B");
list.add("C");
list.add("D");

Spliterator<String> spliterator = list.spliterator();

System.out.println(spliterator.estimateSize());
System.out.println(spliterator.getExactSizeIfKnown());

```

程序输出：

```java
4
4

```

#### 3.3 `Spliterator getComparator()`示例

查找分配器使用的比较器的 Java 示例。

```java
SortedSet<String> set = new TreeSet<>( Collections.reverseOrder() );

set.add("A");
set.add("D");
set.add("C");
set.add("B");

System.out.println(set);

System.out.println(set.spliterator().getComparator());

```

程序输出：

```java
[D, C, B, A]
java.util.Collections$ReverseComparator@7852e922

```

#### 3.4 `Spliterator trySplit()`示例

Java 示例，将元素分为两组并独立进行迭代。

```java
ArrayList<String> list = new ArrayList<>();

list.add("A");
list.add("B");
list.add("C");
list.add("D");
list.add("E");
list.add("F");

Spliterator<String> spliterator1 = list.spliterator();
Spliterator<String> spliterator2 = spliterator1.trySplit();

spliterator1.forEachRemaining(System.out::println);

System.out.println("========");

spliterator2.forEachRemaining(System.out::println);

```

程序输出：

```java
D
E
F
========
A
B
C

```

#### 3.5 `Spliterator forEachRemaining()`示例

使用`forEachRemaining()`方法在单个语句中执行`hasNext()`和`next()`操作的 Java 示例。

```java
ArrayList<String> list = new ArrayList<>();

list.add("A");
list.add("B");
list.add("C");
list.add("D");

Spliterator<String> spliterator = list.spliterator();

spliterator.forEachRemaining(System.out::println);

```

程序输出：

```java
A
B
C
D

```

## 4。总结

在本教程中，我们学习了 Java `Spliterator`接口。 我们学习了`Spliterator`方法和一些简单示例，以遍历集合元素和流，这与`Spliterator`中的其他有用方法分开。

将我的问题放在评论部分。

学习愉快！

参考文献：

[`Spliterator`接口 Java 文档](https://docs.oracle.com/javase/8/docs/api/java/util/Spliterator.html)