Java Spliterator

Java Spliteratorは、四つのイテレーターの一つです – 列挙、IteratorListIterator、そしてSpliterator。

Java Spliterator

IteratorやListIteratorと同様に、SpliteratorはJavaのイテレーターであり、Listを実装したオブジェクトから要素を一つずつ反復処理するために使用されます。Java Spliteratorに関するいくつかの重要なポイントは次のとおりです:

  1. Java SpliteratorはJavaコレクションAPIのインターフェイスです。
  2. Spliteratorは、java.utilパッケージのJava 8リリースで導入されました。
  3. 並列プログラミング機能をサポートしています。
  4. これをコレクションAPIおよびStreamAPIクラスの両方に使用できます。
  5. コレクションまたはAPIオブジェクトに関する特性を提供します。
  6. このイテレーターをMapを実装したクラスには使用できません。
  7. It uses tryAdvance() メソッドを使用して、複数の スレッド で個々の要素を反復処理し、並列処理をサポートしています。
  8. 単一のスレッドで要素を順次反復処理するために、forEachRemaining() メソッドを使用します。
  9. trySplit() メソッドを使用して、自身をサブスプリッタに分割して並列処理をサポートします。
  10. Spliterator は、データの順次および並列処理の両方をサポートしています。

Spliterator そのものは並列プログラミングの振る舞いを提供しません。ただし、それをサポートするいくつかのメソッドを提供します。 開発者は Spliterator インターフェースのメソッドを利用し、Fork/Join Framework を使用して並列プログラミングを実装する必要があります(1つの良いアプローチ)。

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が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を返します。

Java Spliterator Example

このセクションでは、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と比較して、より優れたパフォーマンスを提供します。

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