Java Spliterator是四種迭代器之一 – Enumeration,Iterator,ListIterator和Spliterator。
Java Spliterator
像Iterator和ListIterator一樣,Spliterator是一種Java迭代器,用於從列表實現的對象中逐一迭代元素。關於Java Spliterator的一些重要點包括:
- Java Spliterator是Java集合 API中的一個接口。
- Spliterator在Java 8版本的
java.util
包中引入。 - 它支持並行程序設計功能。
- 我們可以將它用於Collection API和Stream API類。
- 它提供有關集合或API對象的特性。
- 我們不能使用這個迭代器來完成Map實現的類。
- 它使用
tryAdvance()
方法在多个线程中逐个迭代元素,以支持并行处理。 - 它使用
forEachRemaining()
方法在单个线程中按顺序迭代元素。 - 它使用
trySplit()
方法将自身分割为子分割器,以支持并行处理。 - Spliterator支持数据的顺序和并行处理。
Spliterator本身不提供并行编程行为。然而,它提供了一些方法来支持它。开发者应该利用Spliterator接口的方法,并使用Fork/Join Framework(一种良好的方法)来实现并行编程。
Spliterator的主要功能
- 拆分源数据。
- 处理源数据。
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是有大小的,則返回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