Java分割器

Java Spliterator是四个迭代器之一 – Enumeration,IteratorListIterator和Spliterator。

Java Spliterator

与Iterator和ListIterator一样,Spliterator是Java迭代器,用于从实现了List的对象中逐个迭代元素。有关Java Spliterator的一些重要点:

  1. Java Spliterator是Java Collection API中的一个接口。
  2. Spliterator在Java 8版本中引入,位于java.util包中。
  3. 它支持并行编程功能。
  4. 我们可以用它来处理Collection API和Stream API类。
  5. 它提供有关Collection或API对象的特征。
  6. 我们不能将此迭代器用于实现了Map的类。
  7. 它使用tryAdvance()方法在多个线程中逐个迭代元素,以支持并行处理。
  8. 它使用forEachRemaining()方法在单个线程中顺序迭代元素。
  9. 它使用trySplit()方法将自身分割成子分隔器,以支持并行处理。
  10. 分隔器支持数据的顺序和并行处理。

分隔器本身不提供并行编程行为。但是,它提供了一些方法来支持此行为。开发人员应该利用分隔器接口的方法,并使用Fork/Join框架(一种良好的方法)来实现并行编程。

分隔器的主要功能

  • 分割源数据。
  • 处理源数据。

Java Spliterator类图

以下图表显示了Java Spliterator接口的类图。它具有许多字段和方法。

Java Spliterator方法

在这一部分,我们将逐一列出所有的Java Spliterator方法,并附上一些有用的描述。

  1. int characteristics(): 返回此Spliterator及其元素的特征集。
  2. long estimateSize(): 返回forEachRemaining()遍历将遇到的元素数的估计值;如果是无限的、未知的或者计算成本太高,则返回Long.MAX_VALUE。
  3. default void forEachRemaining(Consumer action): 对剩余的每个元素依次执行给定的操作,在当前线程中顺序执行,直到所有元素被处理完毕或者操作抛出异常。
  4. default Comparator getComparator(): 如果此Spliterator的来源是通过Comparator排序的,则返回该Comparator。
  5. default long getExactSizeIfKnown(): 如果此Spliterator是SIZED的,则返回estimateSize()的便捷方法,否则返回-1。
  6. default boolean hasCharacteristics(int characteristics): 如果此Spliterator的characteristics()包含所有给定的特征,则返回true。
  7. boolean tryAdvance(Consumer action): 如果存在剩余元素,则对其执行给定的操作,并返回true;否则返回false。
  8. 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的优点

  1. 与Iterator和ListIterator不同,它支持并行编程功能。
  2. 与Iterator和ListIterator不同,它支持数据的顺序和并行处理。
  3. 与其他迭代器相比,它提供更好的性能。

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