Java分割器
Java的Spliterator是四个迭代器之一——Enumeration、Iterator、ListIterator和Spliterator。
Java分割迭代器
与Iterator和ListIterator一样,Spliterator是一个用于从一个已实现的List对象中逐个迭代元素的Java迭代器。关于Java Spliterator的一些重要点是:
- Java Spliterator是Java Collection API中的一个接口。
Spliterator在Java 8版本中引入,位于java.util包中。
它支持并行编程功能。
我们可以将其用于Collection API和Stream API类。
它提供了有关Collection或API对象的特性。
我们不能将此迭代器用于实现Map的类。
它使用tryAdvance()方法以多线程的方式单独迭代元素,以支持并行处理。
它使用forEachRemaining()方法以单线程的方式按顺序迭代元素。
它使用trySplit()方法将自身分割成子Spliterator,以支持并行处理。
Spliterator支持数据的顺序和并行处理。
Spliterator本身不提供并行编程行为。但是,它提供了一些方法来支持并行编程。开发者应该利用Spliterator接口的方法,并通过使用Fork/Join Framework(一种很好的方法)来实现并行编程。
Spliterator的主要功能
- Splitting the source data.
- Processing the source data.
Java Spliterator类的类图。
Java的Spliterator方法
在本节中,我们将逐一列出所有Java Spliterator方法,并附上一些有用的描述。
- 特性(int characteristics()):返回该Spliterator及其元素的一组特性。
估计大小(long estimateSize()):返回通过forEachRemaining()遍历可能遇到的元素数量的估计值,如果是无限的、未知的或计算成本过高,则返回Long.MAX_VALUE。
forEachRemaining(Consumer action):对剩余的每个元素按顺序在当前线程中执行给定的操作,直到所有元素都被处理完或操作抛出异常。
获取比较器(default Comparator getComparator()):如果该Spliterator的源是通过比较器进行排序的,则返回该比较器。
获取准确大小(default long getExactSizeIfKnown()):如果该Spliterator是确定大小的,则返回估计大小(estimateSize()),否则返回-1。
具有特性(default boolean hasCharacteristics(int characteristics)):如果该Spliterator的特性(characteristics())包含所有给定的特性,则返回true。
尝试推进(boolean tryAdvance(Consumer action)):如果存在剩余的元素,则对其执行给定的操作,并返回true;否则返回false。
尝试拆分(Spliterator trySplit()):如果该Spliterator可以分割,则返回一个覆盖元素的Spliterator,该元素在从此方法返回后将不被此Spliterator覆盖。
Java Spliterator 示例
在这一部分中,我们将讨论如何使用spliterator()创建Java的Spliterator对象,并举一个简单的示例。
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);
}
}
产出:
Rams
Posa
Chinni
如果我们观察上面的程序和输出,我们可以很容易地理解Spliterator.forEachRemaining()方法的工作方式与ArrayList.foreach()方法相同。是的,两者的工作方式相似。
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. |
关于Java中的Spliterator就是这些了。参考:API文档。