Java Spliterator

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

Java Spliterator

像Iterator和ListIterator一樣,Spliterator是一種Java迭代器,用於從列表實現的對象中逐一迭代元素。關於Java Spliterator的一些重要點包括:

  1. Java Spliterator是Java集合 API中的一個接口。
  2. Spliterator在Java 8版本的java.util包中引入。
  3. 它支持並行程序設計功能。
  4. 我們可以將它用於Collection API和Stream API類。
  5. 它提供有關集合或API對象的特性。
  6. 我們不能使用這個迭代器來完成Map實現的類。
  7. 它使用tryAdvance()方法在多个线程中逐个迭代元素,以支持并行处理。
  8. 它使用forEachRemaining()方法在单个线程中按顺序迭代元素。
  9. 它使用trySplit()方法将自身分割为子分割器,以支持并行处理。
  10. Spliterator支持数据的顺序和并行处理。

Spliterator本身不提供并行编程行为。然而,它提供了一些方法来支持它。开发者应该利用Spliterator接口的方法,并使用Fork/Join Framework(一种良好的方法)来实现并行编程。

Spliterator的主要功能

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

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是有大小的,則返回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