Java アドバンス

Java Iterator

Iterator(イテレータ)は、ArrayListHashSet といったコレクション内をループ処理するために使用されるオブジェクトです。

「反復処理する(Iterating)」という言葉がループ処理を指す技術用語であることから、「イテレータ」と呼ばれています。

Iterator を使用するには、java.util パッケージからインポートする必要があります。

1. イテレータの取得

iterator() メソッドを使用することで、あらゆるコレクションから Iterator を取得できます。

1.1 取得の例

// ArrayListクラスとIteratorクラスをインポート
import java.util.ArrayList;
import java.util.Iterator;

public class Main {
  public static void main(String[] args) {

    // コレクションを作成
    ArrayList<String> cars = new ArrayList<String>();
    cars.add("Volvo");
    cars.add("BMW");
    cars.add("Ford");
    cars.add("Mazda");

    // イテレータを取得
    Iterator<String> it = cars.iterator();

    // 最初のアイテムを表示
    System.out.println(it.next());
  }
}

2. コレクションのループ処理

コレクション内の全要素をループ処理するには、IteratorhasNext() メソッドと next() メソッドを組み合わせて使用します。

2.1 ループの例

while(it.hasNext()) {
  System.out.println(it.next());
}

3. コレクションからの要素削除

イテレータは、ループ処理中にその対象となるコレクションを簡単に変更できるように設計されています。remove() メソッドを使用すると、ループの途中でコレクションからアイテムを削除できます。

3.1 削除の例

以下の例では、イテレータを使用してコレクションから 10 未満の数値を削除します。

import java.util.ArrayList;
import java.util.Iterator;

public class Main {
  public static void main(String[] args) {
    ArrayList<Integer> numbers = new ArrayList<Integer>();
    numbers.add(12);
    numbers.add(8);
    numbers.add(2);
    numbers.add(23);
    
    Iterator<Integer> it = numbers.iterator();
    while(it.hasNext()) {
      Integer i = it.next();
      if(i < 10) {
        it.remove();
      }
    }
    System.out.println(numbers);
  }
}

注意: 通常の for ループや for-each ループを使用してループ中に要素を削除しようとすると、ループ処理と同時にコレクションのサイズが変わってしまうため、正しく動作しません(実行時にエラーが発生します)。

4. イテレータでの var キーワードの使用

Java 10 以降では、イテレータの宣言に var キーワードを使用することもできます。コンパイラはコレクションから型を推論できるため、Iterator<String> のような長い型名を繰り返す必要がなくなります。

これによりコードは簡潔になりますが、可読性の観点から依然としてフルタイプを使用する開発者も多いです。モダンな Java プロジェクトでは見かけることが多いため、仕様を理解しておくと良いでしょう。

4.1 var を使用した例

// var を使用しない場合
Iterator<String> it = cars.iterator();

// var を使用する場合
var it = cars.iterator();

ここでvar を使用すると宣言が短くなりますが、実際の型は依然として Iterator<String> として扱われます。