Java Spliterator
Java Spliterator 是四个迭代器之一 - Enumeration、Iterator、ListIterator和 Spliterator。
Java 拆分器
与 Iterator 和 ListIterator 一样,Spliterator 是一个 Java 迭代器,用于从List实现的对象中逐个迭代元素。有关 Java Spliterator 的一些要点如下:
- Java Spliterator 是Java Collection API中的一个接口。
- Spliterator 在Java 8版本中被引入到包中
java.util
。 - 它支持并行编程功能。
- 我们可以将它用于 Collection API 和Stream API 类。
- 它提供有关 Collection 或 API 对象的特征。
- 我们不能将此迭代器用于Map实现的类。
- 它使用方法在多个线程
tryAdvance()
中单独迭代元素以支持并行处理。 - 它使用
forEachRemaining()
方法在单个线程中按顺序迭代元素。 - 它使用
trySplit()
方法将自身划分为子分割器 (Sub-Spliterator) 来支持并行处理。 - Spliterator 支持数据的顺序和并行处理。
Spliterator 本身不提供并行编程行为。但是,它提供了一些方法来支持它。开发人员应该利用 Spliterator 接口方法并使用 Fork/Join 框架实现并行编程(一种好方法)。
Spliterator 的主要功能
- 拆分源数据。
- 处理源数据。
Java Spliterator 类图
下图显示了 Java Spliterator 接口的类图。它有许多字段和方法。
Java Spliterator 方法
在本节中,我们将逐一列出所有 Java Spliterator 方法并提供一些有用的描述。
- int Characteristics():返回此 Spliterator 及其元素的一组特征。
- longestimateSize():返回 forEachRemaining() 遍历中遇到的元素数量的估计值,如果无限、未知或计算成本太高,则返回 Long.MAX_VALUE。
- default void forEachRemaining(Consumer action): 在当前线程中按顺序对每个剩余元素执行给定的操作,直到所有元素都已处理或操作引发异常。
- 默认 Comparator getComparator():如果此 Spliterator 的源由 Comparator 排序,则返回该 Comparator。
- 默认 long getExactSizeIfKnown():便捷方法,如果此 Spliterator 是 SIZED,则返回estimateSize(),否则返回 -1。
- 默认布尔值 hasCharacteristics(int Characteristics):如果此 Spliterator 的 Characteristics() 包含所有给定的特征,则返回 True。
- boolean tryAdvance(Consumer action):如果存在剩余元素,则对其执行给定的操作,返回 true;否则返回 false。
- Spliterator trySplit(): If this spliterator can be partitioned, returns a Spliterator covering elements, that will, upon return from this method, not be covered by this Spliterator.
Java Spliterator Example
In this section, we will discuss about how to create Java Spliterator object using spliterator() and will develop simple example.
import java.util.Spliterator;
import java.util.ArrayList;
import java.util.List;
public class SpliteratorSequentialIteration
{
public static void main(String[] args)
{
List<String> names = new ArrayList<>();
names.add("Rams");
names.add("Posa");
names.add("Chinni");
// Getting Spliterator
Spliterator<String> namesSpliterator = names.spliterator();
// Traversing elements
namesSpliterator.forEachRemaining(System.out::println);
}
}
Output:-
Rams
Posa
Chinni
If we observe the above program and output, we can easily understand that this Spliterator.forEachRemaining() method works in the same way as ArrayList.foreach(). Yes, both works in similar way.
Advantages of Spliterator
- Unlike Iterator and ListIterator, it supports Parallel Programming functionality.
- Unlike Iterator and ListIterator, it supports both Sequential and Parallel Processing of data.
- Compare to other Iterators, it provides better performance.
Iterator vs Spliterator
Iterator | Spliterator |
---|---|
Introduced in Java 1.2. | Introduced in Java 1.8. |
It is an Iterator for whole Collection API. | It is an Iterator for both Collection and Stream API, except Map implemented classes. |
It is an Universal Iterator. | It is NOT an Universal Iterator. |
It does NOT support Parallel Programming. | It supports Parallel Programming. |
That’s all about Spliterator in Java. Reference: API Doc