Java Spliterator是四个迭代器之一 – Enumeration,Iterator,ListIterator和Spliterator。
Java Spliterator
与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()
方法将自身分割成子分隔器,以支持并行处理。 - 分隔器支持数据的顺序和并行处理。
分隔器本身不提供并行编程行为。但是,它提供了一些方法来支持此行为。开发人员应该利用分隔器接口的方法,并使用Fork/Join框架(一种良好的方法)来实现并行编程。
分隔器的主要功能
- 分割源数据。
- 处理源数据。
Java Spliterator类图
以下图表显示了Java Spliterator接口的类图。它具有许多字段和方法。
Java Spliterator方法
在这一部分,我们将逐一列出所有的Java Spliterator方法,并附上一些有用的描述。
- int characteristics(): 返回此Spliterator及其元素的特征集。
- long estimateSize(): 返回forEachRemaining()遍历将遇到的元素数的估计值;如果是无限的、未知的或者计算成本太高,则返回Long.MAX_VALUE。
- default void forEachRemaining(Consumer action): 对剩余的每个元素依次执行给定的操作,在当前线程中顺序执行,直到所有元素被处理完毕或者操作抛出异常。
- default Comparator getComparator(): 如果此Spliterator的来源是通过Comparator排序的,则返回该Comparator。
- default long getExactSizeIfKnown(): 如果此Spliterator是SIZED的,则返回estimateSize()的便捷方法,否则返回-1。
- default boolean hasCharacteristics(int characteristics): 如果此Spliterator的characteristics()包含所有给定的特征,则返回true。
- boolean tryAdvance(Consumer action): 如果存在剩余元素,则对其执行给定的操作,并返回true;否则返回false。
- Spliterator trySplit(): 如果此spliterator可以被分割,则返回一个覆盖元素的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 names = new ArrayList<>();
names.add("Rams");
names.add("Posa");
names.add("Chinni");
// 获取Spliterator
Spliterator namesSpliterator = names.spliterator();
// 遍历元素
namesSpliterator.forEachRemaining(System.out::println);
}
}
输出:
Rams
Posa
Chinni
如果我们观察上面的程序和输出,我们可以很容易地理解这个Spliterator.forEachRemaining()方法的工作方式与ArrayList.foreach()相同。是的,两者的工作方式相似。
Spliterator的优点
- 与Iterator和ListIterator不同,它支持并行编程功能。
- 与Iterator和ListIterator不同,它支持数据的顺序和并行处理。
- 与其他迭代器相比,它提供更好的性能。
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. |
这就是关于Java中的Spliterator的全部内容。参考:API文档
Source:
https://www.digitalocean.com/community/tutorials/java-spliterator