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 Class Diagram

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文档。

发表回复 0

Your email address will not be published. Required fields are marked *