Javaでリストを反復処理する方法
1. 前書き
リストの要素を反復処理することは、プログラムで最も一般的なタスクの1つです。
このチュートリアルでは、Javaでこれを行うさまざまな方法を確認します。 in reverseを実行するのも簡単ですが、リストを順番に繰り返すことに焦点を当てます。
2. forループ
まず、いくつかのfor loopオプションを確認しましょう。
例として国のリストを定義することから始めましょう。
List countries = Arrays.asList("Germany", "Panama", "Australia");
2.1. 基本的なforループ
反復の最も一般的なフロー制御ステートメントは、基本的なforループです。
forループは、セミコロンで区切られた3種類のステートメントを定義します。 最初のステートメントは初期化ステートメントです。 2番目は、終了条件を定義します。 最後のステートメントは、更新句です。
ここでは、単に整数変数をインデックスとして使用しています。
for (int i = 0; i < countries.size(); i++) {
System.out.println(countries.get(i));
}
初期化では、開始点を指定する整数変数を宣言する必要があります。 通常、この変数はリストインデックスとして機能します。
終了条件は、評価後にブール値を返す式であり、この式がfalse と評価されると、ループが終了します。
update句を使用して、インデックス変数の現在の状態を変更し、終了するまでそれを増やしたり減らしたりします。
2.2. 強化されたforループ
拡張されたforループは、リストのすべての要素にアクセスできるようにする単純な構造です。 基本的なforループに似ていますが、より読みやすくコンパクトです。 したがって、はリストを走査するために最も一般的に使用されるフォームの1つです。
拡張されたforループは、基本的なforループよりも単純であることに注意してください。
for (String country : countries) {
System.out.println(country);
}
3. イテレータ
Iteratorは、内部表現を気にすることなくデータ構造をトラバースするための標準インターフェイスを提供するデザインパターンです。
データ構造を走査するこの方法には多くの利点がありますが、その中で、コードが実装に依存しないことを強調できます。
したがって、Iteratorはトラバーサルの実行方法から私たちを抽象化するため、構造は二分木または二重リンクリストにすることができます。 このようにして、不快な問題なしにコード内のデータ構造を簡単に置き換えることができます。
3.1. Iterator
Javaでは、Iteratorパターンはjava.util.Iteratorクラスに反映されます。 JavaのCollectionsで広く使用されています。 Iteratorには、hasNext()メソッドとnext()メソッドの2つの主要なメソッドがあります。
ここでは、両方の使用方法を示します。
Iterator countriesIterator = countries.iterator();
while(countriesIterator.hasNext()) {
System.out.println(countriesIterator.next());
}
hasNext()メソッドchecks if there are any elements remaining in the list。
next()メソッドreturns the next element in the iteration。
3.2. ListIterator
ListIteratorを使用すると、要素のリストを順方向または逆方向のいずれかでトラバースできます。
ListIteratorを使用してリストを前方にスクロールすると、Iteratorで使用されるメカニズムと同様のメカニズムに従います。 このようにして、next()メソッドを使用してイテレーターを前方に移動し、hasNext()メソッドを使用してリストの最後を見つけることができます。
ご覧のとおり、ListIteratorは、以前に使用したIteratorと非常によく似ています。
ListIterator listIterator = countries.listIterator();
while(listIterator.hasNext()) {
System.out.println(listIterator.next());
}
4. forEach()
4.1. Iterable.forEach()
Since Java 8, we can use the forEach() method to iterate over the elements of a list。 このメソッドはIterableインターフェースで定義されており、パラメーターとしてLambda式を受け入れることができます。
構文は非常に簡単です。
countries.forEach(System.out::println);
forEach関数の前は、Javaのすべてのイテレーターがアクティブでした。つまり、特定の条件が満たされるまでデータ収集をトラバースするforループまたはwhileループが含まれていました。
Iterableインターフェースの関数としてforEachが導入されたことにより、Iterableを実装するすべてのクラスにforEach関数が追加されました。
4.2. Stream.forEach()
値のコレクションをストリームに変換して、forEach()、map(),、filter().などの操作にアクセスすることもできます。
ここでは、ストリームの一般的な使用方法を示します。
countries.stream().forEach((c) -> System.out.println(c));
5. 結論
この記事では、Java APIを使用してリストの要素を反復処理するさまざまな方法を示しました。 これらの中で、forループ、拡張されたfor loop、Iterator、ListIterator、およびforEach()メソッド(Java 8に含まれています)について説明しました。
さらに、StreamsでforEach()メソッドを使用する方法も示しました。
最後に、この記事で使用されているすべてのコードは、Github repoで利用できます。