感謝のプログラミング 10000時間

たどり着いた結果(さき)は、感謝でした。

Javaの拡張for文の書き方とイテレータの書き方のサンプル

スポンサーリンク

拡張for構文って何?

リスト、配列や他の任意のコレクションの各要素を取り出して処理したいときに使う。
要素オブジェクトを先頭から1つずつループ変数に代入して、繰り返し処理を行うことができる。

拡張for構文は、Java5から導入された。
これによって、定例的なコードを毎回書く必要もなくなり、配列やコレクションへのアクセスをより簡単にして、要素の取り出しを行うことができるようになった。
構文はこんな感じ。

for (<変数> : <コレクション>) {
	//要素の数だけこのブロック内の文が実行される
}

パーフェクトJava曰く、

Java5以降、拡張for文はイディオムとして定着しています。特別な理由がない限り、拡張for構文で書ける時は拡張for構文で書くことを勧めます。

とのこと。
拡張for文で書かれたものをわざわざfor (int i=0; i < size; i++){}みたいに書き換える必要はないってことだね。

ちなみに、このような簡易記法をプログラミング言語の世界では「シンタックスシュガー」と呼ぶらしい。

サンプルはこちら。

package kiso;

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

public class Sample {
    public static void main(String[] args) {
        //普通のfor文でListに要素を詰め込んでみる
        List<Integer> testList = new ArrayList<Integer>();
        for (int i=0; i<10; i++) {
            testList.add(i);
        }
        
        //拡張for文で取り出してみる
        System.out.println("拡張for構文の例");
        for (Integer val : testList) {
            System.out.print(val.toString() + ",");
        }
        
        //イテレータを使ってみる
        System.out.println("\nイテレータの例:");
        for (Iterator<Integer> ite = testList.iterator(); ite.hasNext();) {
            Integer myVal = ite.next();
            System.out.print(myVal.toString() + ",");
        }
    }
}

これを実行すると、

拡張for構文の例
0,1,2,3,4,5,6,7,8,9,
イテレータの例:
0,1,2,3,4,5,6,7,8,9,

こんな結果が表示される。

なお、パーフェクトJavaでは、拡張for構文を使えない(使うのが望ましくない)場合の例として、
・コレクションの要素を逆方向になめる場合
・ループを中断して抜けたあと、再び同じ位置からループを再開したい場合
・コレクションの要素をなめるループの中で、要素の追加や削除を行う場合
をあげている。

さらに詳しいことは書籍に書いてあるし、パーフェクトJavaは掛け値なしに素晴らしい本なので、ぜひチェックしてみてください。

パーフェクトJava (PERFECT SERIES) (PERFECT SERIES 2)

パーフェクトJava (PERFECT SERIES) (PERFECT SERIES 2)